2013-02-23 2 views
3

Рассмотрим следующий фрагмент кода:nothrow построения виртуальных классов в C++ 11

#include <type_traits> 

struct X { virtual ~X(); }; 

static_assert(std::is_nothrow_default_constructible<X>::value, "fail"); 

Под лязг СВН, он отлично компилируется. Однако с gcc 4.7.2 утверждение терпит неудачу. Какой из них правильный? (И если gcc прав, почему?)

ответ

3

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 за то, что я сам это не собирал. Я бы удалил этот ответ, за исключением того, что, по-моему, информация, которую он содержит, может быть полезна. Спасибо Кассио Нери.

+0

Отлично. Написание 'noexcept' после объявления деструктора фиксирует проблему на данный момент. –

+4

@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. –

Смежные вопросы