Last-Minute-Änderung in Lambda-Syntax oder gcc bug?

8

Ich verwende die svn-Version von gcc-4.7.0 , um einige C ++ 11-Funktionen, z. Lambda-Ausdrücke. Seit ein paar Wochen einige meiner alten Beispiele inklusive Lambdas nicht mehr kompilieren. Ich frage mich:

  • Habe ich eine Änderung in letzter Minute in der C ++ 11-Lambda-Spezifikation verpasst, die in den letzten Wochen in gcc-4.7.0 implementiert wurde?
  • Ist es ein Fehler in gcc, der Inline-Lambdas nicht mehr erkennt?
  • Oder habe ich etwas anderes mit Lambda-Syntax missverstanden?

Der problematische Code scheint Inline-Lambdas zu enthalten, die direkt als Argumente bereitgestellt werden.

Würden Sie sagen, dass der folgende Code der C ++ 11-Code ist?

%Vor%

Wenn ich es ändere und das Lambda zuerst einer Variablen zuweise, funktioniert es:

%Vor%

Ich habe hier ein Beispiel , wo beide mit gcc-4.5 kompiliert werden (außer dass es eine Ausnahme auslöst, wahrscheinlich weil -pthread nicht ist verbunden). Aber wie gesagt: In meinem gcc-4.7.0-svn hat die erste Variante vor einigen Wochen aufgehört zu kompilieren.

Aktualisieren Die Fehlermeldung scheint ein Parse-Fehler zu sein:

%Vor%     
towi 10.11.2011, 14:48
quelle

1 Antwort

3

Soweit ich es aus der im Entwurf n3242 definierten Grammatik ersehen kann, ist dieser Code C ++ 11 gültig. A braced_init-list setzt sich aus einer Liste von initializer-clause zusammen, die assignment-expression s oder selbst braced_init_list s sein kann. Ein assignment-expression kann ein lambda-expression sein, was genau das ist, was Sie als erstes Element haben ( [...](...){...} ).

Daher sollte das Umgeben des Lambda mit Klammern nicht erforderlich sein, wenn Sie denken, dass Sie einen Fehlerbericht sicher einreichen können :). (Natürlich basiert diese Antwort auf einem Entwurf, daher ist die Möglichkeit einer späten Änderung der Grammatik nicht auszuschließen.)

    
Luc Touraille 10.11.2011, 16:26
quelle

Tags und Links