【发布时间】:2015-01-26 00:19:39
【问题描述】:
比如在main函数中,我可以写int arr[42],我可以用range for loop而不指明它的长度for (auto i : arr)。它运作良好。编译器会知道它的长度。
如果我将此数组传递给另一个函数,例如void foo(int arr[]),我不能使用 range for 循环,因为编译器不知道它的长度。
毕竟,如果我有这个模板template<class T, size_t N> void arr_init(T (&foo)[N]),我可以通过arr_init(x) 调用它。显然,编译器调用arr_init(int (&)[42])。
我猜编译器通过声明int[42] 知道数组的长度。我对吗?当我使用 range for 循环和学习模板时,我遇到了这个问题。我以前用C的时候没有遇到过这样的问题。
【问题讨论】:
-
如果您认为
void foo(int arr[])与声明void foo(int* arr)完全没有区别,这可能会有所帮助。 -
为什么不让函数看起来像
foo(int * arr, int arrSize)? -
@peppe 基于范围的 for 不使用
std::begin/std::end。它被指定为与那些函数模板类似的行为方式。 -
@user657267,@Ubica。这只是显示编译器行为的示例。我知道实际上我在使用这个函数
foo(int *arr)时传递了一个指针。谢谢:) -
@LeeRancher 您在 both 这两个函数中传递了一个指针,
arr是一个指针,无论您将其声明为int* arr还是int arr[].