C++ decltype()不';正在编译的类模板不起作用
下面的代码片段有一个问题。 我认为编译器无法推断类型,因为C++ decltype()不';正在编译的类模板不起作用,c++,templates,c++17,C++,Templates,C++17,下面的代码片段有一个问题。 我认为编译器无法推断类型,因为值的元素类型在编译之前是未知的。是这样吗 vector values{1, 2, 3, 4, 5, 6}; vector<decltype(values[0])> {values}; ostream_iterator<int> printer{cout," "}; copy(ints.crbegin(),ints.crend(),printer); 向量值{1,2,3,4,5,6}; 向量{值}; ostream
值的元素类型在编译之前是未知的。是这样吗
vector values{1, 2, 3, 4, 5, 6};
vector<decltype(values[0])> {values};
ostream_iterator<int> printer{cout," "};
copy(ints.crbegin(),ints.crend(),printer);
向量值{1,2,3,4,5,6};
向量{值};
ostream_迭代器打印机{cout,“};
复制(ints.crbegin()、ints.crend()、打印机);
这里的问题是值[0]
是一个int&
。你自己看看:
static_assert(std::is_same_v<decltype(values[0]), int &>);
对于您的示例,这些都不是真正必要的,因为您只是在复制一个向量。所以你可以这样做:
std::vector ints = values;
// Or avoid CTAD entirely
auto ints = values;
这里的问题是values[0]
是int&
。你自己看看:
static_assert(std::is_same_v<decltype(values[0]), int &>);
对于您的示例,这些都不是真正必要的,因为您只是在复制一个向量。所以你可以这样做:
std::vector ints = values;
// Or avoid CTAD entirely
auto ints = values;
我知道这是不必要的。我想看些东西。感谢values[0]
具有typeint
和value category lvalue,decltype规则是这种组合产生int&
。values[0]
的类型实际上不是int&
,表达式不能有引用类型也许谈论decltype(values)
也不错,这也是在左值上使用decltype
,但结果是向量
,而不是向量&
!这是因为decltype(id表达式)
与decltype(任何其他表达式)
有不同的规则
@M.M我认为values[0]
是一个int&
,因为操作符[]
返回一个引用。我不知道还有比这更重要的事。我知道这是不必要的。我想看些东西。感谢values[0]
具有typeint
和value category lvalue,decltype规则是这种组合产生int&
。values[0]
的类型实际上不是int&
,表达式不能有引用类型也许谈论decltype(values)
也不错,这也是在左值上使用decltype
,但结果是向量
,而不是向量&
!这是因为decltype(id表达式)
与decltype(任何其他表达式)
有不同的规则@M.M我认为values[0]
是一个int&
,因为操作符[]
返回一个引用。我不知道还有比这更重要的事。