Clang e as expressões de dobra binária - A maldição do pacote de parâmetros vazio
Especificamente Clang 3.6.0, atualmente hospedado por Coliru.
Todos esses snippets são chamados de:
int main() {
foo();
std::cout << "\n----\n";
foo(1, 2, 3);
}
O código a seguir:
template <class... Args>
void foo(Args... args) {
std::cout << ... << args;
}
Dispara o seguinte erro de compilação:
main.cpp:7:17: error: expected ';' after expression
std::cout << ... << args;
^
;
main.cpp:7:15: error: expected expression
std::cout << ... << args;
^
Então, tentei colocar parênteses em torno da expressão:
(std::cout << ... << args);
Funciona, mas dispara um aviso:
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();
^
Então, tentei descartar o valor da expressão com uma conversão no estilo de função paravoid
:
void(std::cout << ... << args);
Mas :
main.cpp:7:20: error: expected ')'
void(std::cout << ... << args);
^
main.cpp:7:9: note: to match this '('
void(std::cout << ... << args);
^
Eu tentei umstatic_cast
também, pelo mesmo resultado.
Então tentei com um elenco C:
(void)(std::cout << ... << args);
Mas então :
main.cpp:6:18: warning: unused parameter 'args' [-Wunused-parameter]
void foo(Args... args) {
^
... e minha saída é apenas----
: foo(1, 2, 3);
não sai mais!
Clang é amaldiçoado por uma força maligna a partir de padrões futuros, tem um bug ou o problema está sentado na minha cadeira agora?