向后兼容析构函数的noexcept(false)
Backwards compatible noexcept(false) for destructors
直到c++ 03一般都允许析构函数抛出任意异常。
然而,在c++ 11中,所有没有显式异常说明的析构函数默认都是noexcept
。这段代码可以用noexcept(false)
覆盖,但是c++ 11之前的编译器不接受这段代码。
一种解决方案是通过检查特定于编译器的#define
s来检测noexcept(false)
的需要,但这仍然限制了这些代码对已知编译器集的适用性。
是否有任何可移植的方法允许在С++11和c++ 03中从析构函数抛出任意异常?
您可以使用标准提供的__cplusplus
宏:
#if __cplusplus >= 201103L // We are using C++11 or a later version
#define NOEXCEPT_FALSE noexcept(false)
#else
#define NOEXCEPT_FALSE
#endif
然而,更好的方法是永远不要从析构函数抛出。 您不需要依赖"编译器特定的#define
s"…
16.8/1下列宏的名称应由实现定义:
__cplusplus
名称
__cplusplus
在编译c++翻译单元时被定义为值201103L
。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 伪造事实↔false
- QueryWorkingSet总是返回false
- 如何区分地图中的 0 和 false?
- 在noexcept 规范中是否允许使用"this"?
- 使用 noexcept 运算符 depenendet
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- Arduino-C++ bool 不会从 false 变为 true
- 当返回类型声明为 ListNode 时,我们是否可以返回 false<T>*
- NOEXCEPT 函数调用运算符的说明符_Not_fn
- 参数包内 noexcept 说明符
- 当我的 if 条件计算结果为 false 时,我的 else 块将不会执行
- 等于在 c++ 中返回 false
- strcmp 对于相等的字符序列返回 false
- is_nothrow_default_constructible具有noexcept(false)默认构造函数
- C++省略了"noexcept"说明符与"noexception(false)"
- 为什么std::vector使用move构造函数,尽管声明为noexcept(false)
- 向后兼容析构函数的noexcept(false)
- 添加' noexcept(false) '是否对代码有任何好处?
- noexcept(false)析构函数覆盖所有特殊成员函数'异常规范