移动操作的条件编译

时间:2011-06-27 12:06:19

标签: c++ c++11 c-preprocessor move-semantics rvalue-reference

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

#ifdef RVALUE_REFERENCES_SUPPORTED

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

#endif

3 个答案:

答案 0 :(得分:15)

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

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

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

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

答案 1 :(得分:9)

Boost.ConfigBOOST_NO_RVALUE_REFERENCES

答案 2 :(得分:5)

标准方法是检查标准版本:如果__cplusplus==199711L那么您没有(标准)右值参考。如果是__cplusplus==201103L,你可以。显然,这不包括非标准编译器或C ++ 98的非标准扩展。