通常允许C ++ 03析构函数抛出任意异常。
但是,在C ++ 11中,默认情况下,没有显式异常规范的所有析构函数都变为noexcept
。
这可以用noexcept(false)
覆盖,但前C ++ 11编译器不接受此代码。
一种解决方案是通过检查特定于编译器的noexcept(false)
来检测#define
的需求,但这仍然限制了此类代码对已知编译器集的适用性。
是否有任何可移植的方法允许在С++ 11和C ++ 03中从析构函数中抛出任意异常?
答案 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
。