此阵列拷贝如何工作

How does this array copy work?

本文关键字:工作 何工作 阵列 拷贝      更新时间:2023-10-16

>我随机编写了接受数组引用并返回数组的函数,并从旧数组初始化一个新数组:

#include <iterator>
#include <iostream>
using namespace std;
template <typename T>
T& return_arr(T& arr) {
    return arr;
}
int main(){
    double a[] = {1,2,4.5,9};
    auto x = return_arr(a);
    a[2] = 5;
    cout << x[2] << endl;
    //x.dummy_error(); // If this one is uncommented, the compiler says x is a double*
    auto&& y = return_arr(a);
    a[3] = 10;
    cout << y[3] << endl;
    //y.dummy_error(); // If this one is uncommented, the compiler says y is a double[4]
    return 0;
}

为什么x会腐烂到指针?该函数应该返回一个T&auto应该初始化一个 T 类型,对吗?

还有为什么ydouble[4]auto&&应该完美地转发类型,y 应该是double [4] &吧?

有人能解释为什么会发生所有这些吗?

不能按

C++ 中的值传递或返回数组。对不起---你不能。

auto x = return_arr(a);

在此调用中,T被推导出为 double [4] 。所以return_arr引用数组,它还返回对数组的引用。所以这个调用确实做了同样的事情

auto x = a;

x被推算为double*。这是因为auto使用与模板相同的类型推断规则,并且当参数为数组时,非引用模板类型参数被推导为指针。换句话说,衰减发生在这里,正如您通常期望的那样。

auto&& y = return_arr(a);

在这种情况下,由于引用,y被推导出为数组的引用,并且不会发生衰减。所以这真的和

double (&y)[4] = a;

这是一个引用初始化。同样,不会复制数组。

如果要复制数组,请使用 memsetstd::copy 或容器,如 std::vectorstd::array