如何为 C++0x/11 和非 C++0x/11 制作标头

How to make a header for C++0x/11 and non C++0x/11?

本文关键字:C++0x 和非      更新时间:2023-10-16
我想为 C++0x/11

和非 C++0x/11 创建一个标头,以便它具有向后兼容性:

class Foo{
public:
  Foo(){}
  Foo(Foo&){}
#ifdef CXX0X //How to make it work here?
  Foo(Foo&&){}
#endif
};

我建议不要检查__cplusplus,因为 MSVC 和 GCC 都没有将其提高到201103L,并且两者都支持右值引用几年。

您可以依靠特定于编译器的宏来执行您想要的操作:

  • MSVC: _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
};

请记住,函数的定义必须以类似的方式包装。

我会看看提升配置库。它适用于库编写器,并且有很多宏来处理C++编译器版本和实现细节。即使您知道它是一个 C++11 编译器,您可能仍然需要了解一些一致性细节 - boost config 会告诉您。以下是文档的链接:

http://www.boost.org/doc/libs/1_55_0/libs/config/doc/html/index.html