В частности, Clang 3.6.0, который в настоящее время размещается на Coliru.
Все эти фрагменты вызываются из:
int main() {
foo();
std::cout << "\n----\n";
foo(1, 2, 3);
}
Следующий код:
template <class... Args>
void foo(Args... args) {
std::cout << ... << args;
}
Вызывает следующую ошибку компиляции:
main.cpp:7:17: error: expected ';' after expression
std::cout << ... << args;
^
;
main.cpp:7:15: error: expected expression
std::cout << ... << args;
^
Поэтому я попытался поставить скобки вокруг выражения:
(std::cout << ... << args);
Это работает, но вызывает предупреждение:
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();
^
Поэтому я попытался отбросить значение выражения с приведением стиля функции к void
:
void(std::cout << ... << args);
Но :
main.cpp:7:20: error: expected ')'
void(std::cout << ... << args);
^
main.cpp:7:9: note: to match this '('
void(std::cout << ... << args);
^
Я тоже попробовал static_cast
, результат тот же.
Поэтому я попытался вместо этого использовать C-cast:
(void)(std::cout << ... << args);
Но потом :
main.cpp:6:18: warning: unused parameter 'args' [-Wunused-parameter]
void foo(Args... args) {
^
... и мой вывод только ----
: foo(1, 2, 3);
больше не выводится!
Проклят ли Clang злой силой из будущих стандартов, есть ли в нем ошибка или проблема сидит на моем стуле прямо сейчас?
static_cast<void>((std::cout << ... << args));
похоже работает (то есть двойные скобки), и я предполагаю, что clang правильный, так как выражение fold требует своей собственной пары скобок - person Piotr Skotnicki   schedule 12.08.2015(cin << (1 << 2))
вместо((cin >> 1)>> 2)
- person bolov   schedule 12.08.2015