【发布时间】:2018-10-06 03:25:04
【问题描述】:
C++11 std::exception 基类的destructor 不是noexcept,因此可能(理论上)抛出异常,从而放宽对其所有派生类的权限(包括std::bad_alloc和std::runtime_error)。然而,C++98 的析构函数std::exception 有一个throw() 异常规范,表明它不允许抛出异常。为什么有区别?为什么现在允许抛出异常?鉴于std::exception constructors 现在是noexcept,该权限特别奇怪:您可以安全地构造这样的对象,但不能安全地销毁它:与正常行为相反。
让异常类的析构函数抛出异常通常是灾难性的。什么会导致std::exception::~exception 抛出异常?
【问题讨论】:
-
cppreference 上显示的声明实际上是
noexcept。除非声明为noexcept(false),否则析构函数为noexcept
标签: c++ exception destructor