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

时间:2015-03-17 12:16:04

标签: 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();
}

编译时没有评论来自gcc(-std=c++11 -Wall -pedantic)。 Clang说:

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

哪种编译器是对的?

2 个答案:

答案 0 :(得分:17)

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

  

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

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

  

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

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

答案 1 :(得分:1)

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

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