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?

Respuestas a la pregunta(3)

Su respuesta a la pregunta