0

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

然而,在 C++11 中,所有没有显式异常规范的析构函数都成为noexcept默认值。这可以被覆盖,noexcept(false)但此代码不会被 C++11 之前的编译器接受。

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

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

4

2 回答 2

1

您可以使用__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-04T05:34:26.663 回答
0

您不需要依赖“特定于编译器的#defines”...

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

__cplusplus

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

于 2014-07-04T05:37:43.310 回答