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.
'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. –
@SamVarshavchik: Powinieneś napisać to jako odpowiedź cytującą standard. Tak byłoby lepiej !!! – Destructor
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. –