#include <iostream>
using namespace std;
int main()
{
int arr[3][3]
= { { 3, 2, 7 }, { 2, 6, 8 }, { 5, 1, 9 } };
for (auto& y : arr) {
for (int x : y) {
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}
在上面的代码中,如果我们使用
auto
而不是 auto&
,则类型变为指向整数的指针,而使用 auto&
时,类型为整数数组。为什么会出现这种情况?引用如何防止数组衰减为指针?
auto&
也可以创建对指针的引用,但为什么它要创建对数组的引用?
数组到指针的“衰变”是 C++ 中两种效应的结果:
数组无法复制,因此
int array[] = other_array
无效。
必要时,通过数组到指针转换将数组转换为指针。
这意味着
auto y = some_array
(1) 需要数组到指针的转换。 y
不是数组的副本,因为这是不可能的;它是一个指针。或者通俗地说,数组“衰减为指针”。
但是,这不适用于引用绑定。引用可以绑定到任何类型,包括数组。不需要复制,也不需要数组到指针的转换。这意味着在
auto& y = some_array
中,y
只是绑定到某个数组。
(1)
y
对数组的这种初始化发生在基于范围的 for 循环中。有关此类循环扩展的更多信息,请参阅 cppreference 文章。