我有一个带有可变参数构造函数的结构,其中包含一个默认参数:
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
的构造函数是有效的,并且在所有三种情况下都可以推导出n
和args
的值。哪个编译器(如果有的话)是正确的?