为什么数组的大小通过C++编译器已知的引用传递给函数?

use*_*748 5 c++ arrays pass-by-reference

我知道当我想将一个数组传递给一个函数时,它会衰减成指针,所以它的大小不会被知道,这两个声明是等价的:

void funtion(int *tab, int size);
Run Code Online (Sandbox Code Playgroud)

void funtion(int tab[], int size);
Run Code Online (Sandbox Code Playgroud)

我理解为什么.但是,当我传递一个数组作为参考时,我检查过:

void funtion(int (&tab)[4]);
Run Code Online (Sandbox Code Playgroud)

编译器将知道数组的大小,并且不允许我传递不同大小的数组作为此函数的参数.

这是为什么?我知道当我按地址传递数组时,在计算数组中第i个元素的位置时不会考虑大小,所以即使我在函数声明中明确地包含它,它也会被丢弃:

void funtion(int tab[4], int size);
Run Code Online (Sandbox Code Playgroud)

但是当我通过引用传递数组时有什么不同?为什么编译器知道它的大小?

注意:我对编译时已知大小的数组感兴趣,所以我没有使用任何模板.

我在Stack Overflow上发现了类似的问题,但它没有回答我的问题 - 它没有解释为什么编译器知道数组的大小,只有一些关于如何将数组传递给函数的信息.

H. *_*ijt 6

因为它可以,并且因为检查增加了额外的安全性.编译器知道数组的大小,因为你告诉它,就在函数声明中.既然该信息可用,为什么不用它来表示源代码中的错误?

真正的问题是为什么你的最后一个例子不会做同样的检查.不幸的是,这是C遗留的另一部分 - 你永远不会传递一个数组,它总是衰变成一个指针.然后数组的大小变得无关紧要.

可以添加支票吗?可能,但它的用途有限(因为我们现在都使用std :: array - 对!?),因为它无疑会打破一些代码.这个,例如:

void func (char Values [4]);
func ("x");
Run Code Online (Sandbox Code Playgroud)

这是合法的,但不会额外检查数组大小.

  • @ user2738748衰减到指针是C的可怕遗产.没有人喜欢它,但它很难在C++中改变它,因为有一定的愿望是尽可能多地使用C++编译器编译C代码.但由于C中没有引用,C++可以设置任何关于它们的规则,未绑定.并且制定了理智的规则. (3认同)