可变模板代码GCC可编译Clang报错,哪个编译器符合标准?
GCC与Clang对可变模板函数声明的处理差异,哪个符合C++标准?
我在学习C++可变模板时编写了一段示例代码,发现它可以在GCC中正常编译,但在Clang中触发编译错误。
示例代码
template<typename T, typename... V> struct C { T v(V()...);; }; int main() { C<int> c; // GCC可编译,Clang报错 C<int, double, int, int> c2; // 情况相同 }
Clang报错信息
<source>:6:12: error: '...' must be innermost component of anonymous pack declaration T v(V()...);; ^~~ ... 1 error generated. Compiler returned: 1
结论:Clang的处理符合C++标准
根据C++标准规定,在声明包含参数包的函数时,参数包的展开必须是匿名参数声明的最内层组件。
代码中的V()...写法不符合标准:参数包V被嵌套在函数类型V()中再展开,违反了参数包需直接作为参数声明核心部分的要求。如果要声明多个函数指针类型的参数,正确写法应为T v(V(*)()...);;如果是声明多个V类型的参数,则写成T v(V...);。
GCC允许这种写法是其提供的非标准扩展特性,并不符合C++标准规范。跨编译器的可移植代码应当遵循标准写法,避免依赖这类编译器扩展。
内容的提问来源于stack exchange,提问作者user19946454
相关产品推荐
相关产品推荐

