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

时间:2014-07-04 05:21:08

标签: c++ destructor noexcept

通常允许C ++ 03析构函数抛出任意异常。

但是,在C ++ 11中,默认情况下,没有显式异常规范的所有析构函数都变为noexcept。 这可以用noexcept(false)覆盖,但前C ++ 11编译器不接受此代码。

一种解决方案是通过检查特定于编译器的noexcept(false)来检测#define的需求,但这仍然限制了此类代码对已知编译器集的适用性。

是否有任何可移植的方法允许在С++ 11和C ++ 03中从析构函数中抛出任意异常?

2 个答案:

答案 0 :(得分:1)

您可以使用标准提供的__cplusplus宏来执行此操作:

#if __cplusplus >= 201103L                // We are using C++11 or a later version
#define NOEXCEPT_FALSE noexcept(false)
#else
#define NOEXCEPT_FALSE
#endif
然而,更好的想法是简单地从不抛弃析构函数。

答案 1 :(得分:0)

您不需要依赖"编译器特定的#define s" ...

  

16.8 / 1以下宏名称应由实现定义:

__cplusplus

  

在编译C ++翻译单元时,名称__cplusplus被定义为值201103L