这一点与gcc 4.9.2和clang 3.5.2完全不同。该程序:
template<typename ...Ts>
int foo(int i = 0, Ts &&... args)
{
return i + sizeof...(Ts);
}
int main()
{
return foo();
}
编译时不加gcc(-std=c++11 -Wall -pedantic
)的注释。lang声:
error: missing default argument on parameter 'args'
随着foo
修订为:
template<typename ...Ts>
int foo(int i = 0, Ts &&... args = 0)
{
return i + sizeof...(Ts);
}
clang没有抱怨,但是gcc说:
error: parameter pack ‘args’ cannot have a default argument
哪个编译器正确?
从8.3.6([dcl.fct.default])/ 3起:
不得为参数包指定默认参数。
从8.3.6([dcl.fct.default])/ 4起:
在给定的函数声明中,带有默认参数的参数之后的每个参数都应具有在此声明或先前声明中提供的默认参数,或者应为函数参数包。
因此,这允许使用void f(int a = 10, Args ... args)
或确实是您的第一个代码段之类的代码。(感谢@TC查找第二句!)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句