11

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

#ifdef RVALUE_REFERENCES_SUPPORTED

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

#endif
4

3 回答 3

15

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

  • Visual Studio在VC2010中引入了支持,内部版本为1600,可以查看_MSC_VER >= 1600
  • GCC 从4.3 版本开始支持右值引用,因此您可以检查该版本以及__GXX_EXPERIMENTAL_CXX0X__
  • Clang 定义了__has_feature 来做你所需要的:__has_feature(cxx_rvalue_references)

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

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

于 2011-06-27T12:09:56.467 回答
9

Boost.Config可以BOOST_NO_RVALUE_REFERENCES做到这一点。

于 2011-06-27T13:18:01.473 回答
5

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

于 2011-06-27T13:15:22.667 回答