考虑一个有效的代码:
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)
void by_reference(int (*&array), int size)应该不是用来代替?你的假设是错误的,程序是不正确的.请参阅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)
| 归档时间: |
|
| 查看次数: |
1057 次 |
| 最近记录: |