我想为C ++ 0x / 11和非C ++ 0x / 11创建一个标头,以便它具有向后兼容性:
class Foo{
public:
Foo(){}
Foo(Foo&){}
#ifdef CXX0X //How to make it work here?
Foo(Foo&&){}
#endif
};
答案 0 :(得分:2)
我会看一下boost配置库。它适用于库编写者,并且有许多宏来处理C ++编译器版本和实现细节。即使你知道它是一个C ++ 11编译器,你仍然需要知道一些一致性细节 - boost配置会告诉你。这是文档的链接:
http://www.boost.org/doc/libs/1_55_0/libs/config/doc/html/index.html
答案 1 :(得分:2)
我建议不要检查__cplusplus
,因为MSVC或GCC都没有将它提升到201103L
,并且两者都支持r值参考几年。
您可以依靠编译器特定的宏来执行您想要的操作:
_MSC_VER >= 1600
__GXX_EXPERIMENTAL_CXX0X__
__has_feature(cxx_rvalue_references)
__GXX_EXPERIMENTAL_CXX0X__
。
因此,最好使用像Boost.Config这样的预建工具。它已经为宏BOOST_NO_RVALUE_REFERENCES
提供了此功能。
您的示例将读取如下内容:
#include <boost/config.hpp>
class Foo{
public:
Foo();
Foo(Foo&);
#ifndef BOOST_NO_RVALUE_REFERENCES
Foo(Foo&&);
#endif
};
请记住,函数的定义必须类似地包装。