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

时间:2013-09-16 13:29:23

标签: c++ arrays syntax

考虑一个有效的代码:

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)应该

1 个答案:

答案 0 :(得分:6)

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

  

如果参数的类型包含“指向未知T的数组的指针”或“引用”的形式类型   对于T的未知界限的数组,“该程序是不正确的。

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

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

template <std::size_t N>
void by_reference(int (&)[N])
{
    // whatever
}