我对析构函数和noexcept
有点困惑。我的理解是,在C ++ 11中,任何析构函数(包括用户定义的)都隐含noexcept(true)
,即使我们throw
也是如此。如果出于某种原因希望它是那样的话,必须明确指定noexcept(false)
。
我看到的恰恰相反 - 使用GCC 4.7.2,用户定义的析构函数,无论类和析构函数多么原始,都是隐式的noexcept(false)
。我在这里错过了什么?是否有一些隐藏的问题与用户定义的析构函数?
答案 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!");
}