移动操作的条件编译
Conditional compilation for move operations
如何检查编译器是否支持右值引用?是否有标准的预处理器宏,或者不同的编译器有不同的宏?理想情况下,我想写这篇文章:
#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的非标准扩展。
相关文章:
- 访问条件类成员的方法不仅在被调用时才编译
- 如何使用 soong 命名空间来有条件地编译模块
- 如何摆脱为条件编译定义预处理器宏的需要?
- C++中的条件运算符 ( ? : ) 可以编译时吗?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 编译时条件包含.分段标头与包括整个实现
- 如何在Visual Studio 2019中有条件地编译c++源文件
- 基于宏中传递的字符串的条件编译
- 如果条件取决于模板类型并且在编译时已知,是否可以保证C++编译器不会生成分支?
- 从语言设计层面来看,当编译时无法推断条件时,为什么"if constexpr"不衰减到"trival if"
- C++代码在 for 循环的条件下给出运行时错误,而如果它被具有相同意义的代码替换,则编译正确
- Eclipse CDT 条件编译?
- 用于根据条件选择编译时类型的可变参数模板
- 除了使用 #define 进行条件编译之外,还有其他选择吗?
- 如何编译模板类型名的时条件
- 为什么有条件编译运算符模板会更改另一个运算符的可用性?
- C 模板:如何根据数据类型有条件编译不同的代码
- 是否可以在编译时评估使用 std::is_same<> 的此条件?
- 根据编译时条件在类型之间选择类型的惯用方法
- 如果constexpr(条件)为编译时条件