如何保护 C++03 和 C++11 的移动构造函数

How to guard move constructors for C++03 and C++11?

本文关键字:C++11 移动 构造函数 C++03 何保护 保护      更新时间:2023-10-16

这类似于在运行时可以检测到 C++03 和 C++11 之间的哪些差异(如果有的话)?。但在这种情况下,我希望通过预处理器进行检测。

当在 C++03 和 C++11 中使用源时,我们应该如何保护移动构造函数(和移动赋值)?

以下内容是否足够(移动语义是否是C++所有编译器都采用的东西,因为它是必不可少的/核心功能)?

#if (__cpluplus >= 201103L)
    Foo(Foo&& other);
#endif

还是我需要了解编译器的细节?如果我们需要特定于编译器的宏,那么如何处理像Visual Studio 2012 __cplusplus和C++ 11这样的情况?

很抱歉问。我没有一些编译器可以测试,比如Visual Studio 2012,Intel ICC和Comeau。


编辑:该库使用 GNUmakefile 和标准 C++ 03。它不使用Autotools,不使用Cmake,也不使用Boost。

Move 语义是核心C++11 新功能之一(在某些方面,它是新标准的原因之一),因此对于任何符合标准的编译器来说,它应该足够:

#if (__cpluplus >= 201103L)
....
#endif

同上,比如说,像可变参数和汽车的新语义一样"必不可少"的东西。

当然,一旦你进入编译器细节的领域,比如一个损坏的编译器,或者如果你想让移动语义在提供"C++0x"或仿真模式而不是真实的东西的编译器中工作,那么......好吧,你进入了编译器细节的领域。对于其中的一个很好的子集,你甚至不需要采用任何外部库(无论是Boost,cxxomfort等),而只需复制和调整Predef Wiki中的相关宏和测试。