C++ 如何正确检测可用的C++;GCC版本中的11个特性?

C++ 如何正确检测可用的C++;GCC版本中的11个特性?,c++,gcc,c++11,noexcept,C++,Gcc,C++11,Noexcept,可能重复: 我特别感兴趣的是noexcept规范,随着GCC4.7的引入,这些规范似乎把C++11标准库弄得乱七八糟。在这种情况下,检测编译器版本就足够了;这是产生可移植代码的最佳机制吗 #include <system_error> class server_error_category : public std::error_category { public: virtual const char* name () const { ... } //

可能重复:

我特别感兴趣的是
noexcept
规范,随着GCC4.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)

    ...
};
#包括
类服务器错误类别:公共标准::错误类别
{
公众:
虚拟常量char*name()常量{…}
//
//从gcc4.7开始失败,
//更松散的抛出说明符。。。
//重写'virtual const char*std::error_category::name()const noexcept(true)
...
};

如果您只想检查
noexcept
是否在编译时(而不是预处理时)应用于某个特定方法,只需使用
noexcept
操作符即可

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

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

将为不支持
noexcept
规范的编译器定义宏
Boost\u NO\u noexcept
。如果您关心GCC以外的编译器的可移植性,我建议让Boost为您完成这项艰巨的工作。@ildjam Gar,如果这不是最近的事情就好了!如果定义了(u有_特性)和&u有_特性(cxx_noexcept),则可以执行
,并且保证不会在未实现它的编译器上使用noexcept。另一方面,您可能无法在支持noexcept的编译器上利用noexcept,因为它们不支持功能检查宏。。。(AFAIK只对Clang有效)@bames53:
\uuu有功能
不是标准化的,它只是一个特定于Clang的扩展。@ildjarn它确实不是标准化的,但这是一种事实上应该成为标准的东西。
virtual const char* name () const
     noexcept(noexcept(std::declval<std::error_category>().name()))
{ ... }
virtual const char* name () const noexcept { ... }
// valid even in 4.6.