具体的には、現在 Coliru によってホストされている Clang 3.6.0 です。
これらのスニペットはすべて次から呼び出されます。
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キャストで試しました:
(void)(std::cout << ... << args);
しかしその後 :
main.cpp:6:18: warning: unused parameter 'args' [-Wunused-parameter]
void foo(Args... args) {
^
...そして私の出力は----
次のとおりfoo(1, 2, 3);
です。もう出力されません!
Clang は将来の標準からの邪悪な力によって呪われているのでしょうか、バグがあるのでしょうか、それとも問題は私の椅子に座っているのでしょうか?