析构函数和noexcept

时间:2013-03-30 17:47:36

标签: c++ c++11 destructor noexcept

我对析构函数和noexcept有点困惑。我的理解是,在C ++ 11中,任何析构函数(包括用户定义的)都隐含noexcept(true),即使我们throw也是如此。如果出于某种原因希望它是那样的话,必须明确指定noexcept(false)

我看到的恰恰相反 - 使用GCC 4.7.2,用户定义的析构函数,无论类和析构函数多么原始,都是隐式的noexcept(false)。我在这里错过了什么?是否有一些隐藏的问题与用户定义的析构函数?

1 个答案:

答案 0 :(得分:17)

这是一个known bug(用于查找错误报告的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!");
}