可能重复:
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)
...
};
答案 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中。)