Specifically Clang 3.6.0, the one currently hosted by Coliru.
All these snippets are called from :
int main() {
foo();
std::cout << "\n----\n";
foo(1, 2, 3);
}
The following code :
template <class... Args>
void foo(Args... args) {
std::cout << ... << args;
}
Triggers the following compilation error :
main.cpp:7:17: error: expected ';' after expression
std::cout << ... << args;
^
;
main.cpp:7:15: error: expected expression
std::cout << ... << args;
^
So I tried putting parentheses around the expression :
(std::cout << ... << args);
It works, but triggers a warning :
main.cpp:7:6: warning: expression result unused [-Wunused-value]
(std::cout << ... << args);
^~~~~~~~~
main.cpp:11:5: note: in instantiation of function template specialization 'foo<>' requested here
foo();
^
So I tried to discard the value of the expression with a function-style cast to void
:
void(std::cout << ... << args);
But :
main.cpp:7:20: error: expected ')'
void(std::cout << ... << args);
^
main.cpp:7:9: note: to match this '('
void(std::cout << ... << args);
^
I tried a static_cast
too, for the same result.
So I tried with a C-cast instead :
(void)(std::cout << ... << args);
But then :
main.cpp:6:18: warning: unused parameter 'args' [-Wunused-parameter]
void foo(Args... args) {
^
... and my output is only ----
: foo(1, 2, 3);
doesn't output anymore !
Is Clang cursed by an evil force from future standards, does it have a bug, or is the problem sitting on my chair right now ?
static_cast<void>((std::cout << ... << args));
seems to work (that is, double parens), and my guess is that clang is correct, since a fold expression requires its own pair of parentesis – Extravascular(cin << (1 << 2))
instead of((cin >> 1)>> 2)
– Lipo