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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage