向后兼容析构函数的noexcept(false)

Backwards compatible noexcept(false) for destructors

本文关键字:noexcept false 析构函数      更新时间:2023-10-16

直到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