为什么std ::异常驱动器不否
Why is the std::exception destructor not noexcept
c 11 std::exception
基类的破坏者不是 noexcept
,因此(从理论上讲(可能会抛出一个例外,因此,它对所有派生的类别(包括 std::bad_alloc
(进行了放松的许可和std::runtime_error
(。然而,C 98 std::exception
的驱动器具有throw()
例外规范,表明不允许抛出异常。为什么有区别?为什么现在允许抛出异常?鉴于std::exception
构造函数现在是noexcept
:您可以安全地构造这样的对象,但是您不能安全地销毁它:
让异常班级的破坏者抛出一个例外通常是灾难性的。什么会导致std::exception::~exception
抛出异常?
确实是 noexcept(true)
。由于C 11,对于没有例外规范的破坏者,如果例外规范被认为是noexcept(true)
。
除非明确提供了不例外规范,
除外,异常规范被认为是由隐式宣布的破坏者使用的(见下文(。在大多数情况下,这是
noexcept(true)
。因此,必须明确声明抛出攻击子noexcept(false)
。(由于C 11(
[res.on.exception.handling]/3:
在C 标准库中定义的驱动器操作不得抛出例外。C 标准库中的每个破坏者都应表现得像其非临时例外规范一样。
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 函数如何通知用户它基于函数原型抛出异常?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 为什么std ::异常驱动器不否