создание виртуальных классов в c ++ 11

Возьмите следующий фрагмент кода:

#include <type_traits>

struct X { virtual ~X(); };

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

Под clang svn компилируется нормально. Однако с gcc 4.7.2 утверждение не выполняется. Который правильный? (А если gcc прав, почему?)

3

Решение

лязг правильно.

Там были некоторые споры по этому поводу, но конструкция объекта приводит к тому, что его деструктор потенциально вызван:

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

Большое спасибо Кассио Нери за указание на это ниже. Виноват, что не взял это сам. Я бы удалил этот ответ, за исключением того, что думаю, что содержащаяся в нем информация, возможно, полезна Спасибо Кассио Нери.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]