2017-05-02 1 views
10

Die folgenden Code segfaults unter gcc-4.9, 5.4 und 6.3 mit std = C++ 11, aber kompiliert und läuft unter Klirren-3.7 und VS2015-Update 3.gcc Bug mit Lambda Capture von dieser in der Initialisierungsliste mit virtueller Vererbung?

struct A 
{ 
    int Func() { return x++; } 
    int x = 5; 
}; 

struct B 
{ 
    B(int) {} 
}; 

struct Derived : public virtual A, public B 
{ 
    Derived() 
     : A() 
     // , B(this->Func()) // This works! 
     , B([this](){ return this->Func(); }()) // But this segfaults. 
    { 
    } 
}; 

int main() 
{ 
    Derived c; 
} 

Ist das ein Fehler in Ordnung in gcc? Durch Entfernen der virtuellen Vererbung wird der Segfault behoben.

+5

'this' bezieht sich auf eine Instanz' Derived'. Aber es gibt kein 'Derived', bis seine Konstruktion tatsächlich beginnt, doch muss' this ausgewertet werden, um die Basisklasse zu konstruieren, aber bis alle Basisklassen konstruiert sind, gibt es kein 'Derived'. Undefiniertes Verhalten –

+0

@SamVarshavchik: Sie sollten es als eine Antwort schreiben, die den Standard zitiert. Das wäre besser !!! – Destructor

+0

Ich habe tatsächlich versucht, etwas zu finden, aber nach ein paar Minuten sah ich konnte eigentlich nichts finden. Ich nehme an, bis Lambdas herumkommen, könntest du keine Situation haben, in der du ein "This" haben könntest, bevor das Objekt tatsächlich existiert; daher wird dies nicht explizit dargelegt. –

Antwort

Verwandte Themen