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

C++ 参数包函数参数可以默认吗?,c++,c++11,gcc,clang,variadic-templates,C++,C++11,Gcc,Clang,Variadic Templates,这是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(); } 将foo修改为: template<typename ...Ts> int foo(int i = 0, Ts &&..

这是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();
}
foo
修改为:

template<typename ...Ts>
int foo(int i = 0, Ts &&... args = 0)
{
    return i + sizeof...(Ts);
}
哪个编译器是正确的?

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

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

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

在给定的函数声明中,带有默认参数的参数后面的每个参数都应有一个在此声明或之前的声明中提供的默认参数,或者是一个函数参数包


因此,这允许类似于
void f(inta=10,Args…Args)
的代码,或者确实类似于您的第一个代码片段。(感谢@T.C.查找第二句话!)

一位Kerrek SB说,这是不可能的。相反,您可以使用
std::tuple

template <class ... Args>
void foo( std::tuple<Args...> t = std::tuple<int>(0) )
{}
模板
void foo(std::tuple t=std::tuple(0))
{}

[dcl.fct.default]/4(“在给定的函数声明中,带有默认参数的参数后面的每个参数都应该有一个在此声明或之前的声明中提供的默认参数,或者应该是一个函数参数包。”)似乎允许第一个版本。@KerrekSB是,因此它允许GCC接受的版本。@T.C.:是,谢谢,如果你不介意的话,我已经在帖子中吸收了这些内容:-)叮当虫归档:在主干中修复,所以将在下一版本的叮当中修复。太快了!您可以通过重载来解决这个问题:
template intfoo(inti,Ts&&…{return i+sizeof…(Ts);}inline intfoo(){return foo(0);}
error: parameter pack ‘args’ cannot have a default argument
template <class ... Args>
void foo( std::tuple<Args...> t = std::tuple<int>(0) )
{}