为什么使用引用可以防止 C++ 中的数组衰减?[复制]

Why use of references prevent decay of arrays in C++? [duplicate]

提问人:Sarim 提问时间:10/25/2023 更新时间:10/25/2023 访问量:78

问:

#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;
}

在上面的代码中,如果我们使用代替类型,则将指针变成整数,而使用类型时,则为整数数组。为什么会这样?引用如何防止数组衰减到指针?autoauto&auto&

也可以创建对指针的引用,但为什么要创建对数组的引用?auto&

C++ 数组 指针 参考 C++17

评论

1赞 Pepijn Kramer 10/25/2023
你的意思可能是 而不是 .您发布的代码将无法编译。您的问题是使用 std::array<> 的原因之一。std::cout << xstd::cout << a[i][j]
0赞 Mike Nakis 10/25/2023
“如果我们使用 auto 而不是 auto&,类型就会变成指向整数的指针”——是什么让你相信这一点?你怎么知道是这样?
0赞 Some programmer dude 10/25/2023
首先,数组无法复制。因此,按值传递、返回或使用数组是不可能的(除非包装在结构或类中)。
0赞 HolyBlackCat 10/25/2023
@MikeNakis gcc.godbolt.org/z/nx5KsT4GW
1赞 HolyBlackCat 10/25/2023
auto&也可以创建对指针的引用”引用什么指针?计算由衰减产生的指针,它没有持久内存位置。

答:

2赞 Jan Schultke 10/25/2023 #1

数组到指针的“衰减”是 C++ 中两种效果的结果:

  1. 例如,数组无法复制,因此无效。int array[] = other_array

  2. 必要时,通过数组到指针的转换将数组转换为指针。

这意味着 (1) 需要数组到指针的转换。 不是数组的副本,因为这是不可能的;它是一个指针。或者通俗地说,数组“衰减为指针”。auto y = some_arrayy

但是,这不适用于引用绑定。引用可以绑定到任何类型,包括数组。不需要复制,也不需要数组到指针的转换。这意味着 in ,只需绑定到某个数组。auto& y = some_arrayy


(1) y 到数组的这种初始化发生在基于范围的 for 循环中。有关此类循环扩展到什么的详细信息,请参阅 cppreference 一文