最多 C++03 的析构函数通常被允许抛出任意异常。
然而,在 C++11 中,所有没有显式异常规范的析构函数都成为noexcept
默认值。这可以被覆盖,noexcept(false)
但此代码不会被 C++11 之前的编译器接受。
noexcept(false)
一种解决方案是通过检查特定于编译器的s来检测需要#define
,但这仍然限制了此类代码对一组已知编译器的适用性。
是否有任何可移植的方式允许在С++11和C++03中从析构函数中抛出任意异常?
最多 C++03 的析构函数通常被允许抛出任意异常。
然而,在 C++11 中,所有没有显式异常规范的析构函数都成为noexcept
默认值。这可以被覆盖,noexcept(false)
但此代码不会被 C++11 之前的编译器接受。
noexcept(false)
一种解决方案是通过检查特定于编译器的s来检测需要#define
,但这仍然限制了此类代码对一组已知编译器的适用性。
是否有任何可移植的方式允许在С++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
该名称在编译 C++ 翻译单元时
__cplusplus
定义为值。201103L