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.