2016-11-11 18 views
7

これはコンパイル:[] mutable {}がコンパイルされないのはなぜですか?

[]{}; 

だけでなく、この:

[]() mutable {}; 

しかし、このコードでは、コンパイラは私にエラーメッセージを投げる:

[] mutable {}; 
    ^~~~~~~ 
error: lambda requires '()' before 'mutable' 

は、なぜ特定の理由がありますか?

+2

@BaummitAugen読んで理解する標準はそれ自身のスキルです(特に英語が母国語でない場合)。そのような質問をするのは大丈夫です。 – Slava

+0

@BaummitAugen何か特別な理由がある場合は、標準でそのように指定しています。もしそうでなければ、はい、私はこれを数回遭遇したので、これを変更したいと思います。 –

+0

@RalphTandetzky私は正当な理由、おそらく監督を考えることができません。それを変更する提案を書いてください! – TartanLlama

答えて

5

文法が標準に書かれているのは単なる結果です。これが監督かどうかわかりません。

ラムダ式はラムダイントロデューサ(括弧)で始まり、その後にオプションのラムダ宣言子が続きます。

ラムダ宣言子には、引数リスト、変更可能な属性、例外指定子、および戻り値の型が含まれています。これらはすべて引数リストを除いてオプションです。したがって、ラムダ宣言者がまったく存在する場合、かっこがそこになければなりません。

これは、可変キーワードを持つことができないためです。

1

セクション5.1.2 [expr.prim.lambda]をn4296(これはC++ 14の最終草稿)に示します。これは文法から抜け落ちる方法です。 mutableは、括弧を含むラムダ宣言者でのみ許可されています。ラムダ宣言子全体はオプションです(なぜなら、大括弧を省略することができるからです)。

関連する問題