gpt4 book ai didi

c++ - 通过 ref 传递数组

转载 作者:行者123 更新时间:2023-11-30 01:31:52 25 4
gpt4 key购买 nike

引用。到我的last post以及 sellibitze 对该帖子关于按引用而不是按值传递数组的评论,为什么当我按值传递数组时编译器可以推断出参数但如果我按值传递它就不会这样做?

template<class T,int row, int col>
void invert(T (&a)[row][col]) //NOTE AMPERSAND

在上面的声明中,我可以调用:

int main(int argc, char* argv[])
{
invert(a);//HERE ARGUMETS ARE AUTOMATICALLY DEDUCED
}

但如果没有符号,我将不得不这样调用它:

 int main(int argc, char* argv[])
{
invert<int,3,4>(a);
}

@Paul 所以在我声明 fnc 时要说清楚:

void f(int a[]);//I'm passing a pointer

但是当我声明时:

void f(int &a[]);//I'm passing a ref?

我现在理解正确了吗?

最佳答案

那是因为当您“按值”传递数组时,它会衰减为指针。也就是说,您实际上是在传递指向第一个元素的指针,而没有任何大小信息。

当你有这样的签名时:

 void foo(int arr[10]);

然后值 10 将被完全忽略,您可以将任意大小的整数数组传递给它。完全一样

 void foo(int arr[]);

void foo(int* arr);

如您所见,大小信息未保留,因此不能用于推断数组的大小。

对于二维数组,第一维衰减。例如:一个由 20 个整数组成的 10 个数组 (int arr[10][20]) 衰减到一个指向由 20 个整数组成的数组的指针 (int (*arr)[20]) 等,因此无法推导出值 10,但可以推导出第二维 (20) 的大小。

template<class T,int row, int col>
void foo(T (&a)[row][col]) { }

template <class T, int col>
void bar(T arr[][col]) {}

int main()
{
int a[10][20];
foo(a);
bar(a);
}

当您通过引用传递某些内容时,类型会保留,数组不会衰减,所有大小信息都将保持可用。

关于c++ - 通过 ref 传递数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2566200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com