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

4
这类似于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。

4
使用Boost.ConfigBOOST_NO_CXX11_RVALUE_REFERENCES? (建议:使用Boost.Config和BOOST_NO_CXX11_RVALUE_REFERENCES吗?) - T.C.
如果你正在使用CMake,可以查看他们最近添加的编译特性检测 - ComicSansMS
谢谢T.C. 这个库没有使用Boost。我更新了问题以使其更清晰。对于混淆感到抱歉。 - jww
1个回答

1

移动语义是C++11的核心新特性之一(在某种程度上,它是新标准的原因之一),因此对于任何符合规范的编译器,应该足以使用:

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

同样的道理,比如可变参数和自动类型推导的新语义,也是必不可少的。
当然,一旦涉及到编译器的具体细节,例如编译器失效或者想要在提供“C++0x”或仿真模式而不是真正的编译器中使移动语义起作用,那么……你就进入了编译器的具体细节领域。对于其中很好的子集,您甚至不需要采用任何外部库(无论是 Boost、cxxomfort 等),只需复制并调整Predef Wiki中相关的宏和测试即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接