Speziell Clang 3.6.0, die derzeit von Coliru gehostet wird.Clang und die binären falten Ausdrücke - Der Fluch des leeren Parameterpakets
int main() {
foo();
std::cout << "\n----\n";
foo(1, 2, 3);
}
Der folgende Code:
Alle diese Schnipsel aus genannt
template <class... Args>
void foo(Args... args) {
std::cout << ... << args;
}
Löst die folgenden Kompilierungsfehler:
main.cpp:7:17: error: expected ';' after expression
std::cout << ... << args;
^
;
main.cpp:7:15: error: expected expression
std::cout << ... << args;
^
Also habe ich versucht Klammern um den Ausdruck setzen :
(std::cout << ... << args);
Es funktioniert, aber löst eine Warnung:
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();
^
Also habe ich versucht, den Wert des Ausdrucks mit einer Funktion-Casts zu void
zu verwerfen:
void(std::cout << ... << args);
Aber:
main.cpp:7:20: error: expected ')'
void(std::cout << ... << args);
^
main.cpp:7:9: note: to match this '('
void(std::cout << ... << args);
^
Ich versuchte eine static_cast
auch für das gleiche Ergebnis.
Also habe ich versucht, mit einem C-Druckguss statt:
(void)(std::cout << ... << args);
Aber dann:
main.cpp:6:18: warning: unused parameter 'args' [-Wunused-parameter]
void foo(Args... args) {
^
... und meine Ausgabe ist nur : foo(1, 2, 3);
nicht mehr ausgegeben tut!
Wird Clang von einer bösen Kraft aus zukünftigen Standards verflucht, hat es einen Fehler, oder sitzt das Problem gerade auf meinem Stuhl?
Ich kann dies in keinem Compiler kompilieren. versuchte MSVC2015 und http://gcc.godbolt.org/ – NathanOliver
'static_cast ((std :: cout << ... << args));' scheint zu arbeiten (das heißt, doppelte Parens), und meine Vermutung ist dieser Klang ist korrekt, da ein Faltexpression sein eigenes Paar von Parentesis erfordert –
Ich hatte das gleiche Setup mit Cin. Wenn ich mich erinnere, ist das Problem, dass irgendwie versucht wird, '(cin << (1 << 2))' statt '((cin >> 1) >> 2)' – bolov