C++未知边界数组引用作为函数调用参数的合法性咨询
解答
示例1可编译的原因
C标准从未禁止将未知边界数组的引用作为函数形参类型,你此前的认知属于常见误解,GCC 10.x以下版本无法编译是编译器的实现缺陷,并非标准不支持。
GCC 10版本正式修复了该问题,允许已知边界的数组实参(如你示例中的int k[3])绑定到int (&)[]类型的形参:已知长度数组类型int[N]是未知长度数组类型int[]的派生类型,该引用绑定符合标准规则,不会触发数组到指针的退化,因此搭配任意C标准(包括C++11)都可以正常编译。
示例2模板写法的合法性
示例2的写法属于完全合法的C代码,在C11、C17及所有后续C版本中都符合语法要求。
需要注意的是你示例中的模板参数T1没有在函数参数列表中使用,实际调用时需要显式指定T1的类型,否则编译器无法完成模板参数推导。如果你需要利用模板自动推导数组长度,可以采用如下通用写法:
template<typename T, size_t N> void foo(T (&x0)[N]) { // 函数内部可直接使用常量N获取数组长度 }
内容的提问来源于stack exchange,提问作者user16783784
相关产品推荐
相关产品推荐

