移动操作的条件编译

Conditional compilation for move operations

本文关键字:编译 条件 操作 移动      更新时间:2023-10-16

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

#ifdef RVALUE_REFERENCES_SUPPORTED
foobar(foobar&& that)
{
    // ...
}
#endif

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

  • Visual Studio在VC2010中引入了支持,其内部版本为1600,因此您可以使用_MSC_VER >= 1600进行检查
  • GCC从4.3版本起就支持rvalue引用,因此您可以将该版本与__GXX_EXPERIMENTAL_CXX0X__一起检查
  • Clang定义了__has_feature宏,用于执行您需要的操作:__has_feature(cxx_rvalue_references)

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

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

Boost.Config有BOOST_NO_RVALUE_REFERENCES

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