直到C++03,析构函数通常被允许抛出任意异常。
然而,在C++11中,所有没有显式异常规范的析构函数默认为noexcept。这可以用noexcept(false)重写,但是预C++11编译器不会接受这段代码。
一种解决方案是通过检查特定于编译器的noexcept(false)来检测对#define的需求,但这仍然限制了此类代码对已知编译器集的适用性。
在С++11和C++03中是否有允许从析构函数中抛出任意异常的可移植方式?
发布于 2014-07-04 05:34:26
您可以使用标准提供的__cplusplus宏执行此操作:
#if __cplusplus >= 201103L // We are using C++11 or a later version
#define NOEXCEPT_FALSE noexcept(false)
#else
#define NOEXCEPT_FALSE
#endif然而,更好的办法是永远不要从析构函数中抛出。
发布于 2014-07-04 05:37:43
您不需要依赖“特定于编译器的#define”.
16.8/1应根据执行情况确定下列宏名称:
__cplusplus
在编译
__cplusplus翻译单元时,将名称201103L定义为值C++。
https://stackoverflow.com/questions/24567173
复制相似问题