2016-10-18 5 views
18
#include <cassert> 
#include <cmath> 

int main() 
{ 
    struct point_of_cone 
    { 
     double x, y; 
     double z = [&] { using std::sqrt; return sqrt(x * x + y * y); }(); 
    }; 
    point_of_cone p = {3.0, 4.0}; 
    assert(p.z == 5.0); 
} 

Adaequat für clang++ vom Stamm, aber für g++ vom Stamm schlägt mit Fehlermeldung (link):Lambda Verwendung in gcc Standardinitialisierung vs Klirren

error: 'this' was not captured for this lambda function

Definition von point_of_cone in Namespacebereich arbeitet für die Fein beide.

Leicht modifizierte Definition mit [this] Lambda-Capture funktioniert auch für beide im globalen oder lokalen Bereich gut.

Welcher Compiler ist richtig?

+0

diesen Code in Ihrer Frage bitte posten – xaxxon

+0

@Orient Nein, ich bezog mich auf xaxxon godbolt Link, wo er die falsche Flagge gesetzt. – Columbo

+0

Hmm, die Frage ist, sollte '' diese ''erfassen. Nicht sicher über neue Standards, aber die Antwort hier schlägt nicht vor: http://stackoverflow.com/questions/16323032/why-cant-i-capture-this-by-reference-this-in-lambda – Hayt

Antwort

11

Das ist ein GCC-Bug.

int main() { 
    struct A { 
     int x, i = [&] { return x; }(); 
    } a{0}; 
} 

Dies schlägt fehl, aber wenn wir ...

  • Änderung & zu this oder
  • A erklären als Namespace Umfang hat,

es funktioniert. Keiner dieser Faktoren sollte jedoch Auswirkungen auf die Wohlgeformtheit haben.

Berichtet: #78019.

+0

Wenn das der gleiche Fehler ist, den ich in letzter Zeit mehrmals durchgespielt habe, dann ist es eine andere Abhilfe, explizit 'this ->' zu sagen. – Griwes

+2

@Griwes Könntest du das Kontrapositiv verwenden, um daraus abzuleiten, dass dies nicht der Fehler ist, in den du dich begeben hast? :-) – Columbo

Verwandte Themen