2016-11-11 4 views
7

Dies kompiliert:Warum wird [] mutable {} nicht kompiliert?

[]{}; 

Dies auch:

[]() mutable {}; 

Aber mit diesem Code, Compiler-Fehlermeldungen an mich werfen:

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

Gibt es einen besonderen Grund, warum?

+2

@BaummitAugen Lesen und Verstehen Standard ist eine Fähigkeit von ihr (vor allem wenn Englisch nicht Ihre Muttersprache ist), so ist es in Ordnung, solche Fragen IMHO zu stellen. – Slava

+0

@BaummitAugen Ich frage mich, ob es einen bestimmten Grund gibt, der Standard spezifiziert es so. Wenn nicht, dann ja, ich möchte, dass dies geändert wird, weil ich jetzt mehrere Male darüber gestolpert bin. –

+0

@RalphTandetzky Ich kann mir keinen guten Grund vorstellen, höchstwahrscheinlich ein Versehen. Schreiben Sie einen Vorschlag, um es zu ändern! – TartanLlama

Antwort

5

Es ist nur eine Konsequenz der Art, wie die Grammatik im Standard geschrieben ist. Ich weiß nicht, ob das ein Versehen ist oder nicht.

Ein Lambda-Ausdruck beginnt mit einem Lambda-Einführer (den Klammern), gefolgt von einem optionalen Lambda-Deklarator.

Der Lambda-Deklarator enthält die Argumentliste, veränderbare Attribute, den Ausnahmespezifizierer und den Rückgabetyp. All diese Optionen sind optional, mit Ausnahme der Argumentliste. Wenn also ein Lambda-Deklarator überhaupt vorhanden ist, müssen die Klammern dort stehen.

Deshalb können Sie nicht nur das Schlüsselwort mutable haben.

1

Wenn Sie in Abschnitt 5.1.2 [expr.prim.lambda] in n4296 nachschauen (was der C++ 14 final draft ist), ist das genau die Art, wie es aus der Grammatik herausfällt. mutable ist nur in einem Lambda-Deklarator zulässig - der die Klammern enthält. Der gesamte Lambda-Deklarator ist jedoch optional (weshalb Sie die Klammern weglassen können).

Verwandte Themen