4

可能重复:
C++11 功能检查

我对noexcept随着 GCC 4.7 的引入似乎在 C++11 标准库中乱扔垃圾的规范案例特别感兴趣。在这种情况下,检测编译器版本就足够了;这是生成可移植代码的最佳机制吗?

#include <system_error>

class server_error_category : public std::error_category
{
  public:
    virtual const char* name () const {  ...  }
    //
    // fails beginning with gcc4.7, 
    // looser throw specifier ...
    // overriding 'virtual const char* std::error_category::name() const noexcept (true)

    ...
};
4

1 回答 1

2

如果您只想noexcept在编译时(而不是预处理时)检查是否应用于特定方法,您可以简单地使用noexcept运算符。

noexcept(std::declval<std::error_category>().name())
// return 'true' if the expression is 'noexcept'

然后您可以使用语法有条件地使该方法为 noexcept

virtual const char* name () const
     noexcept(noexcept(std::declval<std::error_category>().name()))
{ ... }

您无法检查库是否支持 noexcept 是预处理时间。版本检查是唯一的方法。

noexcept无论如何你都可以扔进去。noexcept即使基类不是,子类的覆盖也是有效的。

virtual const char* name () const noexcept { ... }
// valid even in 4.6.

(请注意,Boost.Config 并没有真正的帮助,因为noexcept从 4.6 开始就支持该语言,但库的使用出现在 4.7 中。)

于 2012-04-23T19:07:41.870 回答