clang is correct.
Там были какими-то споры по этому вопросу, но строительство объекта вызывает его деструктор быть потенциально вызывается:
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1424
Так std::is_nothrow_default_constructible<X>
не только тестирование конструктора по умолчанию, но и ~X()
.
По умолчанию ~X()
имеет неявный noexcept
, применяемый к нему. Если ваш пример либо сделал ~X()
частным, либо удалил его, либо положил на него noexcept(false)
, то static_assert
потерпит неудачу.
Я подозреваю, что gcc 4.7.2 еще не реализовало правило, что деструкторы неявно noexcept
.
Update
Я сделал развертку вопросов РГС/ПРГ, отвечая выше, но пропустили очевидный:
http://cplusplus.github.com/LWG/lwg-active.html#2116
Благодаря много Кассио Нери указывают на это ниже , Mea culpa за то, что я сам это не собирал. Я бы удалил этот ответ, за исключением того, что, по-моему, информация, которую он содержит, может быть полезна. Спасибо Кассио Нери.
Отлично. Написание 'noexcept' после объявления деструктора фиксирует проблему на данный момент. –
@Howard: Мне может быть что-то не хватает, но стоит ли std :: is_nothrow_default_constructible рассматривать деструктор или нет, это открытая проблема: http://cplusplus.github.com/LWG/lwg-active.html#2116. Вы, конечно, понимаете, как LWG работает намного лучше меня, поэтому, пожалуйста, исправьте меня, если моя интерпретация неверна. (Спасибо заранее.) Во всяком случае, эта ошибка была сообщена в GCC: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51452, но (мне кажется) она находится в ожидании уточнения на определение std :: is_nothrow_default_constructible. –