移动操作的条件编译

发布于 2024-11-17 03:05:16 字数 178 浏览 3 评论 0原文

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

#ifdef RVALUE_REFERENCES_SUPPORTED

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

#endif

How can I check whether my compiler supports rvalue references or not? Is there a standard preprocessor macro, or do different compilers have different macros? Ideally, I would want to write this:

#ifdef RVALUE_REFERENCES_SUPPORTED

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

#endif

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

温柔戏命师 2024-11-24 03:05:16

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

  • Visual Studio 在 VC2010 中引入了支持,其内部版本是 1600,因此您可以使用 _MSC_VER >= 1600 检查
  • GCC 自 < a href="http://gcc.gnu.org/projects/cxx0x.html" rel="noreferrer">版本 4.3,以便您可以检查该版本与 __GXX_EXPERIMENTAL_CXX0X__ 一起,
  • Clang 定义了 __has_feature 完全满足您的需要:__has_feature(cxx_rvalue_references)

所以对于最常见的编译器,你自己拼凑一些东西应该相当容易。

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

I'm not aware of any standard preprocessor macro, but:

  • Visual Studio introduced support in VC2010, whose internal version is 1600, so you can check with _MSC_VER >= 1600
  • GCC has supported rvalue references since version 4.3, so you can check for that version along with __GXX_EXPERIMENTAL_CXX0X__
  • Clang defines __has_feature macros for doing exactly what you need: __has_feature(cxx_rvalue_references)

So for most common compilers, it should be fairly easy to cobble something together yourself.

I am also pretty sure that Boost has a macro for this purpose, which you may be able to use if your project includes Boost (otherwise you could look at their implementation)

Boost.Config 具有 BOOST_NO_RVALUE_REFERENCES 为此。

Boost.Config has BOOST_NO_RVALUE_REFERENCES for that.

眼趣 2024-11-24 03:05:16

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

The standard method is to check the standard version : If __cplusplus==199711L then you don't have (standard) rvalue references. If __cplusplus==201103L, you do. Obviously, this doesn't cover non-standard compilers or non-standard extensions to C++98.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文