为什么在 C++ 中使用引用可以防止数组衰减?

问题描述 投票:0回答:1
#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++ arrays pointers reference c++17
1个回答
1
投票

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

    例如,
  1. 数组无法复制,因此

    int array[] = other_array
    无效。

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

这意味着

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

但是,这不适用于引用绑定。引用可以绑定到任何类型,包括数组。不需要复制,也不需要数组到指针的转换。这意味着在

auto& y = some_array
中,
y
只是绑定到某个数组。


(1)

y
对数组的这种初始化发生在基于范围的 for 循环中。有关此类循环扩展的更多信息,请参阅 cppreference 文章

© www.soinside.com 2019 - 2024. All rights reserved.