Возьмите следующий фрагмент кода:
#include <type_traits>
struct X { virtual ~X(); };
static_assert(std::is_nothrow_default_constructible<X>::value, "fail");
Под clang svn компилируется нормально. Однако с gcc 4.7.2 утверждение не выполняется. Который правильный? (А если gcc прав, почему?)
лязг правильно.
Там были некоторые споры по этому поводу, но конструкция объекта приводит к тому, что его деструктор потенциально вызван:
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
,
Обновить
Я ответил на вопросы CWG / LWG, отвечая на вышеизложенное, но пропустил очевидное:
http://cplusplus.github.com/LWG/lwg-active.html#2116
Большое спасибо Кассио Нери за указание на это ниже. Виноват, что не взял это сам. Я бы удалил этот ответ, за исключением того, что думаю, что содержащаяся в нем информация, возможно, полезна Спасибо Кассио Нери.
Других решений пока нет …