Clang y las expresiones de plegado binario: la maldición del paquete de parámetros vacío
Específicamente Clang 3.6.0, el que actualmente aloja Coliru.
Todos estos fragmentos se llaman desde:
int main() {
foo();
std::cout << "\n----\n";
foo(1, 2, 3);
}
El siguiente código:
template <class... Args>
void foo(Args... args) {
std::cout << ... << args;
}
Activa el siguiente error de compilación:
main.cpp:7:17: error: expected ';' after expression
std::cout << ... << args;
^
;
main.cpp:7:15: error: expected expression
std::cout << ... << args;
^
Así que intenté poner paréntesis alrededor de la expresión:
(std::cout << ... << args);
Funciona, pero activa una advertencia:
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();
^
Así que traté de descartar el valor de la expresión con un molde de estilo de función paravoid
:
void(std::cout << ... << args);
Pero :
main.cpp:7:20: error: expected ')'
void(std::cout << ... << args);
^
main.cpp:7:9: note: to match this '('
void(std::cout << ... << args);
^
Probé unstatic_cast
también, por el mismo resultado.
Así que intenté con un C-cast en su lugar:
(void)(std::cout << ... << args);
Pero entonces :
main.cpp:6:18: warning: unused parameter 'args' [-Wunused-parameter]
void foo(Args... args) {
^
... y mi salida es solo----
: foo(1, 2, 3);
ya no sale!
¿Clang es maldecido por una fuerza maligna de estándares futuros, tiene un error o el problema está sentado en mi silla ahora mismo?