I expect the following code to compile:
#include <iostream>
template <class Tag = void, class T = int, class... Args>
void print(T val = T{}, Args... args) {
std::cout << val << ' ' << sizeof...(args) << std::endl;
}
int main() {
print();
print(3.14);
print(0, 1, 2);
}
While it compiles on GCC 5.2 (C++11) despite the unused-but-set-parameter
warnings, clang 3.6 (C++11) gives the following error messages:
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<void, int, int, int>' 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.
So, who is correct?
They're both correct, in a sense.
There's a bug in the standard, CWG 1609, making it unclear whether the code is well-formed or not.
On the CWG summary, it seems there was a consensus that clang should be correct in rejecting the code. Then, a few months later, there was a consensus that GCC should be correct in accepting the code. So who knows what'll happen in C++17.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With