2017-04-14 21 views
11

robiłem kilka testów dla niektórych kodu, które nie skompilować i odkryłem, że ten kod:Pośrednio usunięte domyślny konstruktor pracuje w C++ 14

struct A { 
    A(int) {}; 
    virtual void foo() = 0; 
}; 

struct B : public virtual A { 
    virtual void bar() = 0; 
}; 

struct C : public B { 
    C() : A(1) {} 
    virtual void foo() override {} 
    virtual void bar() override {} 
}; 

int main() { 
    C c; 
    return 0; 
} 

w C++ 11 nie trafia do kompilacji (na g ++ 7.0.1) z ‘B::B()’ is implicitly deleted because the default definition would be ill-formed, natomiast w C++ 14 pomyślnie się kompiluje.

Próbowałem dowiedzieć się, która nowa funkcja C++ 14 pozwoliła na to, aby zadziałało, bezskutecznie. description w cppreference nie wspomina o niczym podobnym, jak się wydaje.

Dlaczego ten kod może się kompilować w C++ 14, ale nie w C++ 11?

+0

Działa w trybie C++ 11 (i C++ 03) w Clang. Więc może błąd w GCC? –

+0

@JosephThomson Myślałem o tym - co prawda nie testowałem tego w Clang, moje złe. I faktycznie działa również w 'g ++' w trybie C++ 03. Może powinienem otworzyć raport o błędzie. – Svalorzen

+0

Zależy, czy ktoś może udzielić odpowiedzi na twoje pytanie! –

Odpowiedz

1

Definitywnie jest to błąd w gcc 7, ponieważ po sprawdzeniu kodu w kompilatorze online z gcc 7+, działał idealnie bez żadnego problemu.

Tutaj podaję ci IDE online, w którym możesz ustawić swój ulubiony kompilator i spróbować zrobić testy, jeśli chcesz.

https://godbolt.org/

Przepraszam nie mogę pomóc lepiej, ale nie mogę odtworzyć swój błąd.

Powiązane problemy