Programm mit "noexcept" -Konstruktor, akzeptiert von gcc, abgelehnt von clang
Der Code
struct T { T() {} };
struct S
{
T t;
S() noexcept = default;
};
int main()
{
// S s;
}
g ++ 4.9.2 akzeptiert dies ohne Fehler oder Warnungen, jedoch klingeln die Berichte 3.6 und 3.7 für Zeile 7:
error: exception specification of explicitly defaulted default constructor does not match the calculated one
Allerdings, wenn die ZeileS s;
ist nicht auskommentiert, g ++ 4.9.2 meldet jetzt:
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 passt zum Originalcode?
Hintergrund
it @ g ++ kann sogar Folgendes zu @ hinzugefügt werdmain
:
std::cout << std::is_constructible<S>::value << '\n';
welche Ausgänge0
. Ich bin auf dieses Problem gestoßen, als ich mit clang einen komplizierten Code kompiliert habe, bei dem Vorlagen, SFINAE und noexcept stark genutzt wurden. In diesem CodeS
undT
sind Vorlagenklassen; Das Verhalten hängt also davon ab, welche TypenS
wurde mit instanziiert. Clang weist es mit diesem Fehler für einige Typen zurück, während g ++ es zulässt und die SFINAE auf @ basieris_constructible
und ähnliche Eigenschaften.