【问题标题】:Conditional compilation for move operations移动操作的条件编译
【发布时间】:2011-09-23 11:16:11
【问题描述】:

如何检查我的编译器是否支持右值引用?是否有标准的预处理器宏,或者不同的编译器有不同的宏?理想情况下,我想这样写:

#ifdef RVALUE_REFERENCES_SUPPORTED

foobar(foobar&& that)
{
    // ...
}

#endif

【问题讨论】:

    标签: c++ c++11 c-preprocessor move-semantics rvalue-reference


    【解决方案1】:

    我不知道有任何标准的预处理器宏,但是:

    • Visual Studio在VC2010中引入支持,内部版本为1600,可以通过_MSC_VER >= 1600查看
    • GCC 从version 4.3 开始支持右值引用,因此您可以与__GXX_EXPERIMENTAL_CXX0X__ 一起检查该版本
    • Clang 定义了 __has_feature macros 来满足你的需要:__has_feature(cxx_rvalue_references)

    所以对于大多数常见的编译器来说,自己拼凑一些东西应该是相当容易的。

    我也很确定 Boost 有一个用于此目的的宏,如果您的项目包含 Boost,您可以使用它(否则您可以查看它们的实现)

    【讨论】:

    • 我必须承认我真的很喜欢 Clang 选择宣传其各种功能和扩展的方式,它比查看版本号更清晰,也更详细。
    【解决方案2】:

    Boost.ConfigBOOST_NO_RVALUE_REFERENCES

    【讨论】:

      【解决方案3】:

      标准方法是检查标准版本:如果__cplusplus==199711L 则您没有(标准)右值引用。如果__cplusplus==201103L,你可以。显然,这不包括非标准编译器或 C++98 的非标准扩展。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        • 2011-10-29
        • 1970-01-01
        • 1970-01-01
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多