为什么decltype()会使用指向引用的指针? 我想了解关于迭代器特性的知识,并在C++教科书上找到了代码片段。因此,我添加了一些代码使其可执行,目的是了解上述编译时机制的行为。完整的程序如下所示: template<typename C> using Iterator_type = typename C::iterator; template<typename Iter> using Iterator_category = typename std::iterator_traits<Iter>::iterator_category; template<typename Ran> void sort_helper(Ran beg, Ran end, std::random_access_iterator_tag) { sort(beg, end); } template<typename For> void sort_helper(For beg, For end, std::forward_iterator_tag) { std::vector<decltype(*beg)> v {beg, end}; sort(v.begin(), v.end()); copy(v.begin(), v.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(std::vector<std::string>& v, std::forward_list<int>& lst) { sort(v); sort(lst); } template<typename C> void print(C& c) { for(auto it = c.begin(); it != c.end(); ++it) { std::cout << *it << '\n'; } std::cout << '\n'; } int main() { std::vector<std::string> v { "Bicycle", "Hoovercraft", "Rocket", "Airplaine", "Bus", "Submarine" }; print(v); sort(v); print(v); std::forward_list<int> lst { 2, 81, 3, 0, 4, 34, 23, 11 }; print(lst); sort(lst); print(lst); return 0; }

为什么decltype()会使用指向引用的指针? 我想了解关于迭代器特性的知识,并在C++教科书上找到了代码片段。因此,我添加了一些代码使其可执行,目的是了解上述编译时机制的行为。完整的程序如下所示: template<typename C> using Iterator_type = typename C::iterator; template<typename Iter> using Iterator_category = typename std::iterator_traits<Iter>::iterator_category; template<typename Ran> void sort_helper(Ran beg, Ran end, std::random_access_iterator_tag) { sort(beg, end); } template<typename For> void sort_helper(For beg, For end, std::forward_iterator_tag) { std::vector<decltype(*beg)> v {beg, end}; sort(v.begin(), v.end()); copy(v.begin(), v.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(std::vector<std::string>& v, std::forward_list<int>& lst) { sort(v); sort(lst); } template<typename C> void print(C& c) { for(auto it = c.begin(); it != c.end(); ++it) { std::cout << *it << '\n'; } std::cout << '\n'; } int main() { std::vector<std::string> v { "Bicycle", "Hoovercraft", "Rocket", "Airplaine", "Bus", "Submarine" }; print(v); sort(v); print(v); std::forward_list<int> lst { 2, 81, 3, 0, 4, 34, 23, 11 }; print(lst); sort(lst); print(lst); return 0; },c++,decltype,iterator-traits,C++,Decltype,Iterator Traits,错误堆栈将导致以下行: in instantiation of template class 'std::__1::vector<int &, std::__1::allocator<int &> >' requested here std::vector<decltype(*beg)> v {beg, end}; 模板类“std::u 1::vector”实例化中的 在此请求 std::向量v{beg,end}; 这可以在Ma

错误堆栈将导致以下行:

in instantiation of template class 'std::__1::vector<int &,     std::__1::allocator<int &> >'
  requested here
std::vector<decltype(*beg)> v {beg, end};
模板类“std::u 1::vector”实例化中的

在此请求
std::向量v{beg,end};
这可以在Mac OS上编译,也可以在Linux上编译,该机器带有g++

我成功地修改了相关部件,如下所示:

auto i = *beg;
std::vector<decltype(i)> v {beg, end};
autoi=*beg;
std::向量v{beg,end};
您能更清楚地解释一下为什么
decltype()
函数返回指向引用的指针吗?我已经阅读了一些关于SO上的
decltype
type函数的其他问题,也阅读了规范,但都没有给我带来正确的方向,检查完整的编译器输出消息堆栈也没有任何帮助


提前感谢您的考虑。

问题是
decltype
会产生一个引用类型(您不能将
std::vector
作为参考类型)。
为什么会这样,我们将深入回答

您可以通过以下两种方式之一进行修复:

  • 使用
    std::remove\u reference::type
  • 使用
    std::iterator\u traits::value\u type

decltype
生成一个引用,但真正的错误是,您试图构建一个引用向量
std::vector
,这最终导致指向引用的指针出现。@VTT,是的,这很清楚。不太明显的是,这是本书作者(比亚恩·斯特劳斯特鲁普)的错误,还是我遗漏了什么?如果这是本书中的错误,它会对迭代器的延迟类型的性质做出假设,而这些假设并不成立。请看下面@LogicStuff的答案。好吧,没有人是完美的,比亚恩·斯特劳斯特鲁普过去肯定可以避免几个大错误。我们可以很容易地忽略书中代码片段中的一些小缺陷
std::vector v{beg,end}给出了更好的解释。
auto i = *beg;
std::vector<decltype(i)> v {beg, end};