In particolare Clang 3.6.0, quello attualmente ospitato da Coliru.Clang e le espressioni di piegatura binaria - La maledizione del pacchetto parametri vuoto
Tutti questi frammenti sono chiamati da:
int main() {
foo();
std::cout << "\n----\n";
foo(1, 2, 3);
}
Il seguente codice:
template <class... Args>
void foo(Args... args) {
std::cout << ... << args;
}
Attiva il seguente errore di compilazione:
main.cpp:7:17: error: expected ';' after expression
std::cout << ... << args;
^
;
main.cpp:7:15: error: expected expression
std::cout << ... << args;
^
Così ho provato a mettere tra parentesi l'espressione :
(std::cout << ... << args);
Funziona, ma innesca un avvertimento:
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();
^
Così ho provato a scartare il valore dell'espressione con un cast di tipo funzione per void
:
void(std::cout << ... << args);
Ma:
main.cpp:7:20: error: expected ')'
void(std::cout << ... << args);
^
main.cpp:7:9: note: to match this '('
void(std::cout << ... << args);
^
Ho provato anche un static_cast
, per lo stesso risultato.
Così ho provato con un C-cast, invece:
(void)(std::cout << ... << args);
Ma poi:
main.cpp:6:18: warning: unused parameter 'args' [-Wunused-parameter]
void foo(Args... args) {
^
... e la mia uscita è solo : foo(1, 2, 3);
non lo fa più di uscita!
Clang è maledetto da una forza malvagia dagli standard futuri, ha un bug, o il problema è seduto sulla mia sedia in questo momento?
Non riesco a farlo compilare in nessun compilatore. provato MSVC2015 e http://gcc.godbolt.org/ – NathanOliver
'static_cast ((std :: cout << ... << args));' sembra funzionare (cioè doppio paren) e la mia ipotesi è quel clang è corretto, dal momento che un'espressione fold richiede la propria coppia di parentesi –
Ho avuto la stessa impostazione con cin. Se ricordo che il problema è che in qualche modo cerca di espandere '(cin << (1 << 2))' invece di '((cin >> 1) >> 2)' – bolov