Ich bin mir nicht sicher, ob es ein Fehler des GCC Compiler oder das beabsichtigte Verhalten von noexcept
ist.
Betrachten Sie das folgende Beispiel:noexcept, erben Konstruktoren und die ungültige Verwendung eines unvollständigen Typs, der tatsächlich abgeschlossen ist
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{};
}
Wenn die noexcept
entfernt wird, kompiliert.
Wie auch immer, wie es in dem Beispiel ist, habe ich diesen Fehler von GCC V5.3.1:
test.cpp:8:31: error: invalid use of incomplete type ‘struct D’
D() noexcept(noexcept(D{42})): B{42} { }
^
Soweit ich weiß, struct D
ist nicht ein unvollständiger Typ, sondern erben Konstrukteuren in der Erklärung beteiligt und Es sieht so aus, als ob der Compiler tatsächlich die Vollständigkeit der Basisstruktur B
mehr als von berücksichtigt.
Ist das das beabsichtigte Verhalten oder ist es legaler Code?
Aus Gründen der Klarheit:
this link Siehe nicht mit zu Die Bugzilla für den GCC-Compiler für weitere Details.
Derzeit ist der Fehler immer noch nicht bestätigt. Ich werde die Frage so bald wie möglich aktualisieren.
Hmm, Clang 3.7.1 akzeptiert diesen Code. Ich wette, das ist ein GCC-Bug. – thirtythreeforty
Ja, für mich hört sich das viel mehr wie ein Fehler im GCC-Compiler an, aber es könnte auch ein Bug im Klirren sein !! Ich bin mir nicht sicher, ob es ein gültiger Code ist, auch wenn es für mich in Ordnung ist. Ein Sprachanwalt würde hier helfen. :-) – skypjack
Ich habe den Ort hinzugefügt, über den sich der Compiler beschwert, zusammen mit einer definitiven Version für zukünftige Googler (der neueste stabile GCC zum Zeitpunkt des Schreibens). – thirtythreeforty