Programa con constructor "noexcept" aceptado por gcc, rechazado por clang
El código:
struct T { T() {} };
struct S
{
T t;
S() noexcept = default;
};
int main()
{
// S s;
}
g ++ 4.9.2 acepta esto sin errores ni advertencias, sin embargo, clang 3.6 y 3.7 informan para la línea 7:
error: exception specification of explicitly defaulted default constructor does not match the calculated one
Sin embargo, si la líneaS s;
no está comentado, g ++ 4.9.2 ahora informa:
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;
^
¿Qué compilador es el adecuado para el código original?
Antecedentes:
g ++ incluso permite que se agregue lo siguiente amain
:
std::cout << std::is_constructible<S>::value << '\n';
que salidas0
. Encontré este problema al usar clang para compilar un código complicado que hacía un uso intensivo de plantillas, SFINAE y no, excepto. En ese códigoS
yT
son clases de plantilla; entonces el comportamiento depende de qué tiposS
fue instanciado con. Clang lo rechaza con este error para algunos tipos, mientras que g ++ lo permite y SFINAE funciona segúnis_constructible
y rasgos similares.