默认参数后的参数包

时间:2018-03-20 15:40:18

标签: c++ templates variadic-templates c++17 default-arguments

我有一个带有可变参数构造函数的结构,其中包含一个默认参数:

struct S {
    template<typename... Args>
    S(int n=0, Args&& ...args) {}
};

int main() {
    S s1;       // fine on clang and g++ (S(0) by default argument, empty Args)
    S s2(1);    // fine on clang and g++ (S(1), empty Args)
    S s3(1, 2); // fine on g++ (S(1, 2), non-empty Args), clang complains (see below)
}

如上所述,S(1, 2)g++(版本7.3,使用标记-std=c++1z-std=c++14进行测试)上编译正常,但是clang(版本6.0.0) ,用相同的标志测试)告诉我以下内容:

<source>:3:26: error: missing default argument on parameter 'args'
    S(int n=0, Args&& ...args) {}
                         ^
<source>:9:7: note: in instantiation of function template specialization 'S::S<int>' requested here
    S s3(1, 2); // fine on g++ (S(1, 2), non-empty Args), clang complains (see below)
      ^

我已经发现Can parameter pack function arguments be defaulted?处理类似的问题,但仅涵盖参数列表完全为空的情况(即S s())。我对案例S(1, 2)特别感兴趣。

standard说:

  

在给定的函数声明中,a之后的每个参数   带有默认参数的参数应具有默认参数   在本声明或之前的声明中提供或应作为一种功能   参数包。

所以我认为S的构造函数是有效的,并且在所有三种情况下都可以推导出nargs的值。哪个编译器(如果有的话)是正确的?

0 个答案:

没有答案