2017-05-02 9 views
10

Następujące naruszenia ochrony pamięci kodu na gcc-4.9, 5.4 i 6.3, z std = C++ 11, ale kompiluje i działa poprawnie pod brzękiem-3.7 i VS2015 Aktualizacja 3.gcc bug z przechwytywaniem lambda na liście inicjalizacji z wirtualnym dziedziczeniem?

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; 
} 

Jest to błąd w gcc? Usunięcie dziedziczenia wirtualnego naprawia błąd segfault.

+5

'this' odnosi się do wystąpienia' Derived'. Ale nie ma "Pochodnej", dopóki jej budowa właściwie się nie rozpocznie, jednak "to" musi zostać ocenione w celu skonstruowania klasy bazowej, ale dopóki wszystkie klasy bazowe nie zostaną zbudowane, nie ma "Pochodnej". Niezdefiniowane zachowanie. –

+0

@SamVarshavchik: Powinieneś napisać to jako odpowiedź cytującą standard. Tak byłoby lepiej !!! – Destructor

+0

Naprawdę próbowałem znaleźć coś takiego, ale po kilku minutach szukania niczego nie mogłem znaleźć. Wydaje mi się, że dopóki nie pojawiło się lambdas, nie mógłbyś mieć sytuacji, w której mógłbyś mieć "to", zanim obiekt faktycznie istnieje; stąd nie jest to wyraźnie określone. –

Odpowiedz

Powiązane problemy