Der Code:Programm mit "noexcept" Konstruktor von gcc akzeptiert, von Klirren abgelehnt
struct T { T() {} };
struct S
{
T t;
S() noexcept = default;
};
int main()
{
// S s;
}
g ++ 4.9.2 dies ohne Fehler oder Warnungen akzeptiert, klirrte jedoch 3.6 und 3.7 Bericht für Zeile 7:
error: exception specification of explicitly defaulted default constructor does not match the calculated one
wenn jedoch die Leitung S s;
nicht kommentiert geführt wird, g ++ 4.9.2 jetzt berichtet:
noex.cc: In function 'int main()':
noex.cc:12:7: error: use of deleted function 'S::S()'
S s;
^
noex.cc:7:5: note: 'S::S() noexcept' is implicitly deleted because its exception-specification does not match the implicit exception-specification ''
S() noexcept = default;
^
Welcher Compiler ist richtig für den Originalcode?
Hintergrund:
g ++ selbst ermöglicht folgendes main
hinzugefügt werden:
std::cout << std::is_constructible<S>::value << '\n';
die 0
ausgibt. Ich habe dieses Problem, wenn Klappern mit einigen komplizierten Code zu kompilieren, die starke Nutzung von Vorlagen, SFINAE und noexcept gemacht. In diesem Code S
und T
sind Template-Klassen; Das Verhalten hängt also davon ab, mit welchen Typen S
instanziiert wurde. Clang lehnt es mit diesem Fehler für einige Arten, während g ++ es erlaubt und die SFINAE arbeiten nach is_constructible
und ähnlichen Zügen.
Weil im S-Konstruktor Sie Aufruf an T-Konstruktor bekommen, die jede Ausnahme werfen könnte.Clang ist richtig, glaube ich, –
@SeverinPappadeux das ist wahr, über die Ausnahmen, aber das Problem scheint zu sein, ob der Code sofort zurückgewiesen werden sollte, oder ob der Effekt von '= default' darin besteht, * als gelöscht zu definieren * was g ++ zu tun scheint. –