Il codice:Programma con il costruttore "noexcept" accettato da gcc, rifiutato da clang
struct T { T() {} };
struct S
{
T t;
S() noexcept = default;
};
int main()
{
// S s;
}
g ++ 4.9.2 accetta questo con errori o avvisi, tuttavia clang 3.6 e 3.7 rapporto per la linea 7:
error: exception specification of explicitly defaulted default constructor does not match the calculated one
Tuttavia, se la linea S s;
non è commentata, g ++ 4.9.2 ora riporta:
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;
^
Quale compilatore è giusto per il codice originale?
Priorità:
g ++ permette anche il seguente da aggiungere ai main
:
std::cout << std::is_constructible<S>::value << '\n';
che emette 0
. Ho riscontrato questo problema durante l'utilizzo di clang per compilare un codice complicato che ha fatto un uso massiccio di modelli, SFINAE e noxcept. In quel codice S
e T
sono classi template; quindi il comportamento dipende da quali tipi di S
sono stati istanziati con. Clang lo rifiuta con questo errore per alcuni tipi, mentre g ++ lo consente e lo SFINAE funziona basato su is_constructible
e tratti simili.
Perché nel costruttore S riceverai una chiamata al costruttore T che potrebbe generare qualche eccezione.Clang ha ragione, credo che –
@SeverinPappadeux sia vero circa le eccezioni ma il problema sembra essere se il codice debba essere immediatamente respinto, o se l'effetto di '= default' dovrebbe essere su * define as deleted * che g ++ sembra fare. –