以下两段代码之间的唯一区别是引用的使用.我理解为什么第一个代码片段无法编译,并且正在寻求帮助以理解第二个代码编译的原因.
第一个片段:
int a[2][3] = {0,1,2,3,4,5};
for (auto row : a)
for (auto column : row)
cout << column << endl;
Run Code Online (Sandbox Code Playgroud)
上面的代码没有编译,因为'row'的类型是int的指针,而不是序列.
第二个片段:
int a[2][3] = {0,1,2,3,4,5};
for (auto &row : a)
for (auto column : row)
cout << column << endl;
Run Code Online (Sandbox Code Playgroud)
这段代码编译.如果我正确理解auto是如何工作的,'row'是对int指针的引用.但为什么这个引用可以被视为一个序列而不是常规指针?
通过模板参数推导来完成类型的推导.
template <typename U>
void foo(U&); // Equivalent to auto&
foo(row);
Run Code Online (Sandbox Code Playgroud)
这将始终演绎U是确切类型的row(如果它是一个左值在这种情况下),这给了我们,我们需要的数组类型.
仅对于非参考参数,执行的是数组到指针的衰减.
外部迭代的每个元素都是一个数组。在第一种情况下,auto按值获取元素,因此会发生数组到指针的衰减,并且您无法循环遍历单个指针。
在第二种情况下,您将获得对数组的引用,当然您可以对其进行迭代。