【发布时间】:2013-09-16 13:29:22
【问题描述】:
考虑一个有效的代码:
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)?
【问题讨论】:
-
"现在定义这样的函数绝对有效" 不,不是:
error: parameter ‘array’ includes reference to array of unknown bound ‘int []’(link) -
不过,clang 接受它。 IMO 它应该是有效的,它只是对不完整类型的引用。
reinterpret_cast是另一个故事。 -
你能注意哪个编译器抱怨声明吗?
-
"clang 接受它" != "绝对有效"
-
不是您问题的答案,但您是否考虑过使用 std::array?为这种非常方便的类型定义一个模板
是完全合理的:所有的性能,没有任何令人头疼的问题。