Nie jestem pewien, czy jest to błąd kompilatora GCC lub zamierzonego zachowania noexcept
.
Rozważmy następujący przykład:noexcept, dziedziczenie konstruktorów i nieprawidłowe użycie niekompletnego typu, który jest rzeczywiście kompletny
struct B {
B(int) noexcept { }
virtual void f() = 0;
};
struct D: public B {
using B::B;
D() noexcept(noexcept(D{42})): B{42} { }
void f() override { }
};
int main() {
B *b = new D{};
}
Jeśli noexcept
jest usuwany, kompiluje.
W każdym razie, jak to jest w tym przykładzie, mam ten błąd od v5.3.1 GCC:
test.cpp:8:31: error: invalid use of incomplete type ‘struct D’
D() noexcept(noexcept(D{42})): B{42} { }
^
O ile mi wiadomo, struct D
nie jest niekompletny typ, ale dziedziczenie konstruktorzy są zaangażowane w rachunku i Wygląda na to, że kompilator faktycznie rozważa kompletność podstawowej struktury, niż .
Czy to zamierzone zachowanie, czy też jest to kodeks prawny?
Dla jasności:
Zobacz this link do the bugzilla dla kompilatora GCC dla dalszych szczegółów.
Obecnie błąd jest nadal niepotwierdzony. Zaktualizuję to pytanie tak szybko, jak to możliwe.
Hmm, Clang 3.7.1 akceptuje ten kod. Założę się, że jest to błąd GCC. – thirtythreeforty
Tak, dla mnie brzmi to znacznie bardziej jako błąd w kompilatorze GCC, ale może to być również błąd w klangu !! Nie jestem pewien, czy to prawidłowy kod, mimo że dla mnie wygląda dobrze. Pomoże w tym prawnik językowy. :-) – skypjack
Dodałem lokalizację, na którą kompiluje się skarga, wraz z ostateczną wersją dla przyszłych pracowników Google (najnowszy stabilny GCC w tym piśmie). – thirtythreeforty