移动操作的条件编译

fre*_*low 11 c++ rvalue-reference move-semantics c-preprocessor c++11

如何检查我的编译器是否支持右值引用?是否有标准的预处理器宏,或者不同的编译器有不同的宏?理想情况下,我想写这个:

#ifdef RVALUE_REFERENCES_SUPPORTED

foobar(foobar&& that)
{
    // ...
}

#endif
Run Code Online (Sandbox Code Playgroud)

jal*_*alf 15

我不知道任何标准的预处理器宏,但是:

  • Visual Studio在VC2010中引入了支持,其内部版本为1600,因此您可以查看 _MSC_VER >= 1600
  • 4.3版以来,GCC一直支持rvalue引用,因此您可以检查该版本__GXX_EXPERIMENTAL_CXX0X__
  • Clang定义了用于完全满足您需求的__has_feature :__has_feature(cxx_rvalue_references)

因此对于大多数常见的编译器来说,自己拼凑一些东西应该相当容易.

我也很确定Boost有一个用于此目的的宏,如果您的项目包含Boost,您可以使用它(否则您可以查看它们的实现)

  • 我必须承认我真的很喜欢Clang选择宣传其各种功能和扩展的方式,它比检查版本号更清晰,而且更加详细. (4认同)

Geo*_*che 9

Boost.Config就是BOOST_NO_RVALUE_REFERENCES这样.


MSa*_*ers 5

标准方法是检查标准版本:如果__cplusplus==199711L那样你没有(标准)右值引用.如果__cplusplus==201103L,你这样做.显然,这不包括非标准编译器或C++ 98的非标准扩展.