2017-04-14 1 views
11

Ich war für einige Code einige Tests zu tun, die nicht zusammenstellen, und ich entdeckte, dass dieser Code:Implizit gelöscht Standardkonstruktors arbeitet in 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; 
} 

In C++ 11 (auf kompilieren schlägt fehl g ++ 7.0.1) mit ‘B::B()’ is implicitly deleted because the default definition would be ill-formed, während in C++ 14 kompiliert erfolgreich.

Ich habe versucht, herauszufinden, welche neue Funktion von C++ 14 dies funktioniert, vergeblich. Die description in cppreference erwähnt nichts von der Art, wie es scheint.

Warum kann dieser Code in C++ 14, aber nicht in C++ 11 kompiliert werden?

+0

Funktioniert in C++ 11 (und C++ 03) Modus in Clang. Also vielleicht ein Fehler in GCC? –

+0

@JosephThomson Ich dachte darüber nach - zugegebenermaßen habe ich es in Clang nicht getestet, mein Schlechter. Und tatsächlich funktioniert es auch in 'g ++' im C++ 03 Modus. Also vielleicht sollte ich einen Fehlerbericht öffnen. – Svalorzen

+0

Hängt davon ab, ob jemand eine Antwort auf deine Frage geben kann! –

Antwort

1

Definitiv ist es ein Fehler in GCC 7, denn wenn ich Ihren Code in einem Online-Compiler mit gcc 7+ ausgecheckt habe, hat es perfekt funktioniert, ohne irgendein Problem.

Also hier gebe ich Ihnen diese IDE online, wo Sie Ihren Lieblings-Compiler einstellen und versuchen können, Tests zu tun, wenn Sie möchten.

https://godbolt.org/

Es tut sie mich nicht helfen kann, besser aber ich kann nicht Ihre Fehler reproduzieren.

Verwandte Themen