析构函数和noexcept

38

我对析构函数和 noexcept 有些困惑。我的理解是,在 C++11 中,任何析构函数,包括用户定义的,都会隐式地被视为 noexcept(true),即使我们从其中 throw。如果有人出于某种原因希望它不是这样,就必须明确指定 noexcept(false)

然而,我发现情况恰好相反 - 在 GCC 4.7.2 中,无论类和析构函数多么原始,用户定义的析构函数都会隐式地被视为 noexcept(false)。我错过了什么?用户定义的析构函数有什么隐藏的陷阱吗?


8
若一个析构函数没有异常规格说明,它会被默认为具有与隐式声明相同的异常规格说明(参见15.4)。也就是说,只有当所有成员和基类都有 noexcept 析构函数时,析构函数才被视为 noexcept(true)。 - ipc
1个回答

23
这是一个已知的漏洞(感谢原帖发现漏洞报告),看起来在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!");
}

5
我原本没有想到将“bug”作为另一个搜索关键词。现在我用了这个方法(多亏了你),找到了Bug 56191。感谢您的快速回复! - lapk
@PetrBudnik:谢谢您提供的链接,我会将其添加到答案中! - Andy Prowl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接