Programa com o construtor "noexcept" aceito pelo gcc, rejeitado pelo clang
O código:
struct T { T() {} };
struct S
{
T t;
S() noexcept = default;
};
int main()
{
// S s;
}
O g ++ 4.9.2 aceita isso sem erros ou avisos, no entanto, o clang 3.6 e 3.7 reportam para a linha 7:
error: exception specification of explicitly defaulted default constructor does not match the calculated one
No entanto, se a linhaS s;
não é comentado, o g ++ 4.9.2 agora 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;
^
Qual compilador é adequado para o código original?
Fundo:
O g ++ ainda permite que o seguinte seja adicionado aomain
:
std::cout << std::is_constructible<S>::value << '\n';
quais saídas0
. Encontrei esse problema ao usar o clang para compilar algum código complicado que fazia uso pesado de modelos, SFINAE e noexcept. Nesse códigoS
eT
são classes de modelos; então o comportamento depende de quais tiposS
foi instanciado com. O Clang o rejeita com esse erro para alguns tipos, enquanto o g ++ permite e o SFINAE funciona com base emis_constructible
e características semelhantes.