我有点困惑与破坏者和noexcept
。我的理解是,在C++ 11中,包括用户定义在内的任何析构函数都隐含地是noexcept(true)
,即使我们从它那里得到throw
。如果出于某种原因需要这样做,则必须明确指定noexcept(false)
。破坏者和不接受
我看到的与GCC 4.7.2完全相反,用户定义的析构函数,无论类和析构函数有多简单,都暗含noexcept(false)
。我在这里错过了什么?是否有一些隐藏的用户定义的析构函数?
我有点困惑与破坏者和noexcept
。我的理解是,在C++ 11中,包括用户定义在内的任何析构函数都隐含地是noexcept(true)
,即使我们从它那里得到throw
。如果出于某种原因需要这样做,则必须明确指定noexcept(false)
。破坏者和不接受
我看到的与GCC 4.7.2完全相反,用户定义的析构函数,无论类和析构函数有多简单,都暗含noexcept(false)
。我在这里错过了什么?是否有一些隐藏的用户定义的析构函数?
这是一个known bug(用于发现错误报告的信用点),它似乎已在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!");
}
我其实并没有想到使用“bug”作为额外的搜索关键字。现在我做了(感谢你),发现了[Bug 56191](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56191)。感谢您的及时响应! – lapk
@PetrBudnik:感谢您的链接,我会将其添加到答案! –
12.4/3:“在没有异常规格析构函数的声明被视为隐含使 具有与隐式声明(15.4)相同的异常规范。“即如果所有成员和基础都有noexcept析构函数,析构函数只是'noexcept(true)'。 – ipc