考虑一个有效的代码:
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);
void by_reference(int (*&array), int size)
应该不?答案 0 :(得分:6)
你的假设是错误的,程序是不正确的。参见C ++ 11标准8.3.5 / 8:
如果参数的类型包含“指向未知T的数组的指针”或“引用”的形式类型 对于T的未知界限的数组,“该程序是不正确的。
clang允许将其作为编译器扩展。例如,g ++不会接受它。
但是,您可以使用模板来推断传递的数组的大小:
template <std::size_t N>
void by_reference(int (&)[N])
{
// whatever
}