如何检查我的编译器是否支持右值引用?是否有标准的预处理器宏,或者不同的编译器有不同的宏?理想情况下,我想这样写:
#ifdef RVALUE_REFERENCES_SUPPORTED
foobar(foobar&& that)
{
// ...
}
#endif
如何检查我的编译器是否支持右值引用?是否有标准的预处理器宏,或者不同的编译器有不同的宏?理想情况下,我想这样写:
#ifdef RVALUE_REFERENCES_SUPPORTED
foobar(foobar&& that)
{
// ...
}
#endif
我不知道任何标准的预处理器宏,但是:
_MSC_VER >= 1600
__GXX_EXPERIMENTAL_CXX0X__
__has_feature
宏来做你所需要的:__has_feature(cxx_rvalue_references)
所以对于大多数常见的编译器来说,自己拼凑一些东西应该是相当容易的。
我也很确定 Boost 有一个用于此目的的宏,如果您的项目包含 Boost,您可以使用它(否则您可以查看它们的实现)
Boost.Config可以BOOST_NO_RVALUE_REFERENCES
做到这一点。
标准方法是检查标准版本:如果__cplusplus==199711L
您没有(标准)右值引用。如果__cplusplus==201103L
,你会的。显然,这不包括非标准编译器或 C++98 的非标准扩展。