Деструкторы и noexcept

Я немного запутался с деструкторами и noexcept. Я понял, что в С++ 11 любой деструктор, включая определяемый пользователем, неявно noexcept(true), даже если мы throw от него. И нужно указать явно noexcept(false), если они хотят, чтобы это было по какой-то причине.

То, что я вижу, - это совсем другое - с GCC 4.7.2, определяемый пользователем деструктор, независимо от того, насколько примитивен класс и деструктор, неявно noexcept(false). Что мне здесь не хватает? Есть ли скрытая информация с определяемыми пользователем деструкторами?

Ответ 1

Это известная ошибка (кредиты OP для поиска отчета об ошибке), и, похоже, она была исправлена ​​в GCC 4.8. 0. Например, статическое утверждение ниже будет запускаться на GCC 4.7.2, но не на GCC 4.8.0:

struct X
{
    ~X() { };
};

int main()
{
    X x;

    // This will not fire even in GCC 4.7.2 if the destructor is
    // explicitly marked as noexcept(true)
    static_assert(noexcept(x.~X()), "Ouch!");
}