2013-03-30 60 views
24

我有点困惑与破坏者和noexcept。我的理解是,在C++ 11中,包括用户定义在内的任何析构函数都隐含地是noexcept(true),即使我们从它那里得到throw。如果出于某种原因需要这样做,则必须明确指定noexcept(false)破坏者和不接受

我看到的与GCC 4.7.2完全相反,用户定义的析构函数,无论类和析构函数有多简单,都暗含noexcept(false)。我在这里错过了什么?是否有一些隐藏的用户定义的析构函数?

+4

12.4/3:“在没有异常规格析构函数的声明被视为隐含使 具有与隐式声明(15.4)相同的异常规范。“即如果所有成员和基础都有noexcept析构函数,析构函数只是'noexcept(true)'。 – ipc

回答

16

这是一个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!"); 
} 
+3

我其实并没有想到使用“bug”作为额外的搜索关键字。现在我做了(感谢你),发现了[Bug 56191](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56191)。感谢您的及时响应! – lapk

+0

@PetrBudnik:感谢您的链接,我会将其添加到答案! –