如何通过引用未知大小的数组来调用函数?

Vyt*_*ius 8 c++ arrays syntax

考虑一个有效的代码:

template<size_t size>
void by_numbered_reference(int (&array)[size]);
Run Code Online (Sandbox Code Playgroud)

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

现在它是有效的(在Apple clang 3.0版上测试)来定义这样的功能:

void by_reference(int (&array)[], int size);
Run Code Online (Sandbox Code Playgroud)

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

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

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

nij*_*sen 6

你的假设是错误的,程序是不正确的.请参阅C++ 11标准8.3.5/8:

如果参数的类型包括"指向T的未知边界的数组的指针"或"对T的未知边界的数组的引用"形式的类型,则该程序是不正确的.

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

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

template <std::size_t N>
void by_reference(int (&)[N])
{
    // whatever
}
Run Code Online (Sandbox Code Playgroud)