参数包函数参数可以默认吗?

Mik*_*han 24 c++ gcc clang variadic-templates c++11

这是关于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();
}
Run Code Online (Sandbox Code Playgroud)

编译没有gcc(-std=c++11 -Wall -pedantic)的评论.Clang说:

error: missing default argument on parameter 'args'
Run Code Online (Sandbox Code Playgroud)

随着foo修订为:

template<typename ...Ts>
int foo(int i = 0, Ts &&... args = 0)
{
    return i + sizeof...(Ts);
}
Run Code Online (Sandbox Code Playgroud)

clang没有抱怨,但gcc说:

error: parameter pack ‘args’ cannot have a default argument
Run Code Online (Sandbox Code Playgroud)

哪个编译器是对的?

Ker*_* SB 22

从8.3.6([dcl.fct.default])/ 3:

不应为参数包指定默认参数.

从8.3.6([dcl.fct.default])/ 4:

在给定的函数声明中,具有默认参数的参数之后的每个参数都应具有在此声明或先前声明中提供的默认参数,或者应为函数参数包.

因此,这允许代码void f(int a = 10, Args ... args),或者确实像您的第一个代码段.(感谢@TC查找第二句!)

  • [dcl.fct.default]/4("在给定的函数声明中,带有默认参数的参数后面的每个参数都应该具有在此声明或前一个声明中提供的默认参数,或者应该是函数参数包.")似乎允许第一个版本. (3认同)

edm*_*dmz 5

Kerrek SB 说,这是不可能的。相反,你可以做的是使用std::tuple

template <class ... Args>
void foo( std::tuple<Args...> t = std::tuple<int>(0) )
{}
Run Code Online (Sandbox Code Playgroud)