代码分发期间发生错误

Errors occur during tag dispatch

#include <iterator>
#include <forward_list>
#include <string>
#include <vector>

using namespace std;

template<typename C>
using Iterator_type = typename C::iterator;

template<typename Iter>
using Iterator_category = typename iterator_traits<Iter>::iterator_category;

template<typename Ran>
void sort_helper(Ran beg, Ran end, random_access_iterator_tag){
    sort(beg,end);
}

template<typename For>
void sort_helper(For beg, For end, forward_iterator_tag){
    vector<decltype(*beg)> vc{beg, end};
    sort(vc.begin(),vc.end());
    copy(vc.begin(),vc.end(),beg);
}

template<typename C>
void sort(C& c){
    using Iter = Iterator_type<C>;
    sort_helper(c.begin(),c.end(),Iterator_category<Iter>{});
}

void test(vector<string>& vs, forward_list<double>& lls){
    sort(vs);
    sort(lls);
}

我遇到编译错误 -- 形成指向引用类型 double&

的指针

来自 Bjarne Stroustrup 的代码 -- C++ 编程语言 5.4.2.1 iterator_traits

来自 Bjarne 的 errata list for the book

pg 125: s/decltype(*beg)/Value_type<For>/ reparing the use of decltype would take more space than I have here.

vector<decltype(*beg)> 试图创建一个 vector<double&>,这是不可能的。

在下面的语句中:

vector<decltype(*beg)> vc{beg, end};

decltype 说明符产生一个引用类型(要么是因为它解引用了一个导致左值的指针并且它本身是一个表达式,要么是因为 operator* 来自 For class-type 将引用类型声明为其 return 类型),不能存储在向量中。相反,您应该再次利用 std::iterator_traits 来获取基础类型。

vector<typename iterator_traits<For>::value_type> vc{beg, end};