2016-02-11 6 views
7

汎用参照によって任意の数の引数をとり、それらを完全に無視するラムダを書いてみたいと思います。明白な方法は、可変引数ユニバーサルパラメータパックの構文を使用し、パラメータ名を省略して次のようになります。何どのようにそのパラメータを破棄する一般的なvariadicラムダを記述するのですか?

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

:これは私がtry to pass a non trivially-copyable objectまで(GCC 4.9.2で)正常に動作

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

やっている?私のコードは不正ですか、これは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] 

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

+3

これはGCCバグのようです。それは5.2での(作品)(http://coliru.stacked-crooked.com/a/e1b37f5289b7c8ec)。 – TartanLlama

+0

@TartanLlama「作品」の定義については、 5.2は、非自明コピー可能オブジェクトを '...'で渡すことをサポートしていますが、解析バグは修正されていません。IIRC。 –

答えて

10

GCCのparsing bugです(これはあなた自身が報告したものです)。 auto&&...は文法的に曖昧であり、auto&&, ...の等価またはパラメータパック宣言のいずれかとして解析できる(技術的に、問題は...パラメータ宣言節または抽象宣言子の一部であるかどうかです)。標準はそれが後者として解析されると言います。 GCCはそれを前者として解析します。パックネーミング

が解析曖昧さを解決:

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

又はsizeof...を使用:

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

警告を抑制するためには、(@Lucダントンが示唆されているように、または、[[gnu::unused]]__attribute__((__unused__))を適用することができます

auto my_lambda = [](auto&&... unused) { (void) sizeof...(unused); return 42; }; 
+1

GCCが記述されているので、 'type var [[gnu :: unused]]'は 'type var __attribute __((__ unused __))'の代わりです。 –

+2

@LucDanton、そして最終的に '[[maybe_unused]]'となります。 –

関連する問題