7

ユニバーサル参照によって任意の数の引数を取り、それらを完全に無視するラムダを書きたいと思います。明らかな方法は、可変長ユニバーサル パラメーター パックの構文を使用し、パラメーター名を省略することです。

auto my_lambda = [](auto&&...) { return 42; };

単純にコピーできないオブジェクトを渡そうとするまで、これは(gcc 4.9.2で)正常に機能します:

struct S { S() {} S(S const&) {} };
my_lambda("meow", 42, S{});
^ error: cannot pass objects of non-trivially-copyable type 'struct S' through '...'

どうしたの?コードの形式が正しくありませんか、それとも gcc のバグですか?

どちらの場合でも、最善の回避策は何ですか? パラメーターの名前付けが機能することがわかりましたが、未使用パラメーターの警告が表示されました。

auto my_lambda = [](auto&&... unused) { return 42; };
^ error: unused parameter 'unused#0' [-Werror=unused-parameter]
^ error: unused parameter 'unused#1' [-Werror=unused-parameter]
^ error: unused parameter 'unused#2' [-Werror=unused-parameter]

テンプレート パラメーター パックの未使用パラメーターの警告をどのように抑制しますか?

4

1 に答える 1