【问题标题】:Destructors and noexcept析构函数和 noexcept
【发布时间】:2013-03-21 05:38:02
【问题描述】:

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

我看到的恰恰相反——在 GCC 4.7.2 中,用户定义的析构函数,无论类和析构函数多么原始,都隐含为 noexcept(false)。我在这里想念什么?用户定义的析构函数是否存在一些隐藏的问题?

【问题讨论】:

  • 12.4/3:“没有异常规范的析构函数声明被隐式认为具有与隐式声明 (15.4) 相同的异常规范。”即,如果所有成员和基础都具有 noexcept 析构函数,则析构函数仅是 noexcept(true)

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


【解决方案1】:

这是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!");
}

【讨论】:

  • 我其实没想过使用“bug”作为额外的搜索关键字。现在我做到了(谢谢你)这出现了Bug 56191。感谢您的及时回复!
  • @PetrBudnik:谢谢你的链接,我会把它添加到答案中!
猜你喜欢
  • 2018-06-19
  • 2014-08-25
  • 2021-09-14
  • 2023-03-28
  • 2016-07-07
  • 2018-10-06
  • 1970-01-01
  • 2017-05-15
相关资源
最近更新 更多