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
使用不同的规则。我现在明白了。我觉得它使用了相同的规则。