8

考虑一个有效的代码:

template<size_t size>
void by_numbered_reference(int (&array)[size]);

该函数接受一个数组作为参数,编译器可以使用模板参数推导来推断它的大小。

现在定义这样的函数是有效的(在 Apple clang 3.0 版上测试):

void by_reference(int (&array)[], int size);

哪个(应该)接受对未知大小数组的引用作为参数。注意int[]int[n]是不同的类型,通常是不兼容的。

我发现如何调用此函数的唯一方法是:

int * array;
by_reference(reinterpret_cast<int(&)[]>(*array), array_size);
  1. 为什么语言接受对未知大小数组的引用作为有效的函数参数,而没有直接的方法来定义这样的变量?
  2. 是否有任何需要此语法的已知用例?
  3. 为什么void by_reference(int (*&array), int size)应该改用?
4

1 回答 1

6

您的假设是错误的,程序格式错误。参见 C++11 标准 8.3.5/8:

如果参数的类型包括“指向 T 的未知边界数组的指针”或“对 T 的未知边界数组的引用”形式的类型,则程序是非良构的。

clang 允许将其作为编译器扩展。例如,g++ 不会接受它。

但是,您可以使用模板来推断传递数组的大小:

template <std::size_t N>
void by_reference(int (&)[N])
{
    // whatever
}
于 2013-09-16T13:53:03.470 回答