Код:
struct T { T() {} };
struct S
{
T t;
S() noexcept = default;
};
int main()
{
// S s;
}
g++ 4.9.2 принимает это без каких-либо ошибок или предупреждений, однако, сообщения clang 3.6 и 3.7 для строки 7:
error: exception specification of explicitly defaulted default constructor does not match the calculated one
Однако, если строка S s;
не закомментирована, g++ 4.9.2 теперь сообщает:
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;
^
Какой компилятор подходит для исходного кода?
Фон:
g++ даже позволяет добавить в main
следующее:
std::cout << std::is_constructible<S>::value << '\n';
который выводит 0
. Я столкнулся с этой проблемой при использовании clang для компиляции сложного кода, который сильно использовал шаблоны, SFINAE и noexcept. В этом коде S
и T
находятся шаблонные классы; поэтому поведение зависит от того, какие типы S
были созданы. Clang отклоняет его с этой ошибкой для некоторых типов, тогда как g++ разрешает это, а SFINAE работает на основе is_constructible
и подобных признаков.