gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:39 25 4
gpt4 key购买 nike

我知道当我想将一个数组传递给一个函数时,它会退化为指针,所以它的大小是未知的,这两个声明是等价的:

void funtion(int *tab, int size);

void funtion(int tab[], int size);

我明白为什么。但是,当我将数组作为引用传递时,我检查过:

void funtion(int (&tab)[4]);

编译器会知道数组的大小,不会让我将不同大小的数组作为此函数的参数传递。

这是为什么呢?我知道当我按地址传递数组时,在计算数组中 ith<​​/em> 元素的位置时不会考虑大小,因此即使我明确地将它包含在函数声明:

void funtion(int tab[4], int size);

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

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

我找到了 a similar question在 Stack Overflow 上,但是它没有回答我的问题 - 它没有解释为什么编译器知道数组的大小,只有一些关于如何将数组传递给函数的信息。

最佳答案

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

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

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

void func (char Values [4]);
func ("x");

这目前是合法的,但不会对数组大小进行额外检查。

关于c++ - 为什么 C++ 中的编译器知道数组的大小通过引用传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35923389/

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