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?
Działa w trybie C++ 11 (i C++ 03) w Clang. Więc może błąd w GCC? –
@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
Zależy, czy ktoś może udzielić odpowiedzi na twoje pytanie! –