Я немного запутался с деструкторами и noexcept
, Насколько я понимаю, в C ++ 11 любой деструктор, в том числе пользовательский, неявно noexcept(true)
даже если мы throw
от него. И нужно указать явно noexcept(false)
если они хотят, чтобы это было так по какой-то причине.
Что я вижу, так это то, что с GCC 4.7.2 пользовательский деструктор, независимо от того, насколько примитивны класс и деструктор, явно неявно noexcept(false)
, Что мне здесь не хватает? Есть ли какие-то скрытые ошибки с пользовательскими деструкторами?
Это известная ошибка (кредиты ОП за нахождение отчета об ошибке), и, похоже, это было исправлено в 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!");
}
Других решений пока нет …