我希望编译以下代码:
#includetemplate void print(T val = T{}, Args... args) { std::cout << val << ' ' << sizeof...(args) << std::endl; } int main() { print(); print(3.14); print(0, 1, 2); }
尽管有unused-but-set-parameter
警告,它在GCC 5.2(C++ 11)上编译,但是clang 3.6(C++ 11)给出了以下错误消息:
main.cpp:4:33: error: missing default argument on parameter 'args' void print(T val = T{}, Args... args) { ^ main.cpp:11:5: note: in instantiation of function template specialization 'print' requested here print(0, 1, 2); ^ main.cpp:4:33: error: missing default argument on parameter 'args' void print(T val = T{}, Args... args) { ^ 2 errors generated.
那么,谁是正确的?
从某种意义上说,它们都是正确的.
标准CWG 1609中存在一个错误,不清楚代码是否格式正确.
在CWG摘要中,似乎已经达成共识,即clang 在拒绝代码方面应该是正确的.然后,几个月后,人们一致认为GCC 在接受代码方面应该是正确的.那么谁知道C++中会发生什么17.