移动操作的条件编译
如何检查我的编译器是否支持右值引用?是否有标准的预处理器宏,或者不同的编译器有不同的宏?理想情况下,我想这样写:
#ifdef RVALUE_REFERENCES_SUPPORTED
foobar(foobar&& that)
{
// ...
}
#endif
How can I check whether my compiler supports rvalue references or not? Is there a standard preprocessor macro, or do different compilers have different macros? Ideally, I would want to write this:
#ifdef RVALUE_REFERENCES_SUPPORTED
foobar(foobar&& that)
{
// ...
}
#endif
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我不知道任何标准的预处理器宏,但是:
_MSC_VER >= 1600
检查__GXX_EXPERIMENTAL_CXX0X__
一起,__has_feature
宏 完全满足您的需要:__has_feature(cxx_rvalue_references)
所以对于最常见的编译器,你自己拼凑一些东西应该相当容易。
我也非常确定 Boost 有一个用于此目的的宏,如果您的项目包含 Boost,您也许可以使用该宏(否则您可以查看它们的实现)
I'm not aware of any standard preprocessor macro, but:
_MSC_VER >= 1600
__GXX_EXPERIMENTAL_CXX0X__
__has_feature
macros for doing exactly what you need:__has_feature(cxx_rvalue_references)
So for most common compilers, it should be fairly easy to cobble something together yourself.
I am also pretty sure that Boost has a macro for this purpose, which you may be able to use if your project includes Boost (otherwise you could look at their implementation)
Boost.Config 具有
BOOST_NO_RVALUE_REFERENCES
为此。Boost.Config has
BOOST_NO_RVALUE_REFERENCES
for that.标准方法是检查标准版本:如果
__cplusplus==199711L
那么您没有(标准)右值引用。如果__cplusplus==201103L
,你就这么做了。显然,这不包括非标准编译器或 C++98 的非标准扩展。The standard method is to check the standard version : If
__cplusplus==199711L
then you don't have (standard) rvalue references. If__cplusplus==201103L
, you do. Obviously, this doesn't cover non-standard compilers or non-standard extensions to C++98.