如何在GCC版本中正确检测可用的C ++ 11功能?

时间:2012-04-23 18:52:00

标签: c++ gcc c++11 noexcept

  

可能重复:
  C++11 Feature Checking

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

#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)

    ...
};

1 个答案:

答案 0 :(得分:2)

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

noexcept(std::declval<std::error_category>().name())
// return 'true' if the expression is '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并没有真正帮助,因为语言中的4.6支持noexcept,但库使用情况显示在4.7中。)