C++11 std::vector元素上的decltype
为什么不编译下面的代码C++11 std::vector元素上的decltype,c++11,decltype,C++11,Decltype,为什么不编译下面的代码 std::vector<int> v{1,2}; decltype(v[0]) i; //doesn't work decltype(v)::value_type j; //works std::vector v{1,2}; decltype(v[0])i//不起作用 decltype(v):值\类型j//作品 我收到错误测试。cpp:31:18:错误:引用变量“I”的声明需要初始值设定项。这里不是int类型的v[0] 我
std::vector<int> v{1,2};
decltype(v[0]) i; //doesn't work
decltype(v)::value_type j; //works
std::vector v{1,2};
decltype(v[0])i//不起作用
decltype(v):值\类型j//作品
我收到错误测试。cpp:31:18:错误:引用变量“I”的声明需要初始值设定项。这里不是int
类型的v[0]
我知道即使它真的工作了,在向量为空的情况下,它也不会像后者那样安全,但我觉得这应该是运行时问题,而不是编译时问题。decltype(v[0])
生成表达式类型v[0]
,它是对元素的引用(除非v
是vector
)。必须初始化引用变量,这就是编译器错误消息所说的
您可以使用auto
按值获取元素,也可以使用auto&
按引用获取元素:
auto element = v[0];
auto& element_ref = v[0];
在这种情况下,decltype(v[0])
产生了int&
?这很有趣。我认为它的工作原理类似于auto
并在引用未被推导的地方建立模板。@Iamanon请参见auto
中的第4点使用标准模板推导规则(即从不推导引用),而decltype
使用不同的规则。我现在明白了。我觉得它使用了相同的规则。