【问题标题】:Backwards compatible noexcept(false) for destructors析构函数的向后兼容 noexcept(false)
【发布时间】:2014-08-25 08:56:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • 可移植的方式是从析构函数中抛出异常,无论是 C++03 还是 C++11。 Read this 讨论为什么可以抛出的析构函数是一个坏主意。还有一个GotW article也谈到了它。

标签: c++ destructor noexcept


【解决方案1】:

你可以使用标准提供的__cplusplus宏来做到这一点:

#if __cplusplus >= 201103L                // We are using C++11 or a later version
#define NOEXCEPT_FALSE noexcept(false)
#else
#define NOEXCEPT_FALSE
#endif

然而,更好的想法是永远不要从析构函数中抛出。

【讨论】:

    【解决方案2】:

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

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

    __cplusplus

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-21
      • 2021-09-14
      • 1970-01-01
      • 2010-09-24
      • 2017-01-09
      • 2018-06-19
      相关资源
      最近更新 更多