【问题标题】:Which gcc version is needed to use unordered_map from C++11?使用 C++11 中的 unordered_map 需要哪个 gcc 版本?
【发布时间】:2015-03-19 12:24:47
【问题描述】:

我目前在 RHEL 5.4 上安装了 gcc 4.1,但我想使用 unordered_map。正如我发现的那样,这仅在 C++11 中引入标准,因此不可用。一种替代方法是使用__gnu_cxx::hash_map,但我更喜欢使用标准。

在另一台开发主机上,我碰巧有 RHEL 6.4 和 gcc 4.4,它知道 unordered_map,但给出以下警告:

../include/c++/4.4.7/c++0x_warning.h:31:2: error: #error 此文件需要编译器和库支持即将推出的 ISO C++ 标准 C++0x。此支持目前处于试验阶段,必须使用 -std=c++0x 或 -std=gnu++0x 编译器选项启用。

从 gcc homepage 我似乎无法找出支持 unordered_map 的 gcc 版本。

[编辑] 为了澄清我的问题: 根据客户的要求,我坚持使用几个操作系统及其版本,因此我不能总是更新到最新的 GCC 版本并感到高兴。我需要保持我的软件在所有平台上的兼容性。

因此,我正在寻找使用unordered_map 所需的最低 GCC 版本。我知道向 GCC 提供 -std=c++0x 可以修复上述错误,但我不知道“实验性”警告在多大程度上意味着 我不应该使用 @ 987654329@.

this thread 中的一些人强烈建议不要使用这个实验性 C++11 实现

...那我该怎么办?

【问题讨论】:

  • 你真的读过这个错误吗?尤其是最后关于编译器选项的部分。
  • 是的,我确实阅读了警告,并且我完全意识到警告会随着上述选项而消失。然而,非常自然的问题是,experimental 是什么意思,如果我只想在 C++11 中使用 unordered_map,这对我来说是否有任何问题。
  • 没有理由为 C++11 使用 gcc 4.1。只需获取最新的版本。
  • 不是我来决定应该/可以在我们的各种平台(redhat、solaris、hp-ux、aix)上使用哪个版本的 gcc,这取决于我们的客户安装和移植/迁移工作。我知道最新的当然是最好的选择,但这不可能,所以我试图找出unordered_map所需的最低版本(我不想要也不需要整个 C++11 标准),如果有人能为我回答这个问题,我将不胜感激。
  • 我赞成这个问题,因为我处于类似的情况,我被某个旧版本的 gcc 卡住了,每当我想尝试一些 C++11 功能时,我都会收到这个错误。 “实验性”吓跑了人们。当新的 -std=c++xx 尚未完成时,我希望 gcc 可以不断地和增量地为 -std=gnu++xx 包含新的语言功能。

标签: c++ c++11 gcc unordered-map


【解决方案1】:

您无法在 GCC 页面上找到此类信息。有关于library features 的信息,但仅限于当前版本的 GCC。在您的 GCC 4.4 中,您可以简单地使用 -std=c++0x 标志来删除警告。

如果您害怕实验性并且无法更新编译器 - 请不要使用 C++11 中的 unordered_map。你可以自己写,使用tr1中的一个,或者使用boost中的一个,无论如何。

如果您只查看 GCC 网站 - 那里有消息:

重要提示:GCC 对 C++11 的支持仍处于试验阶段。一些 功能是基于早期提案实现的,没有尝试 将在更新时保持向后兼容性 以匹配最终的 C++11 标准。

顺便说一句,C++11 标准的所有功能都是在 GCC 中实现的,它实际上是旧标准,因为现在 C++14 已经被批准,但支持仍然是过期的。

我不知道为什么它仍然是实验性的,例如在 clang 网站上:

Clang 完全实现了所有已发布的 ISO C++ 标准,包括 C++11,以及即将到来的 C++14 标准,以及部分 初出茅庐的 C++1z 标准,被认为是生产质量的 C++ 编译器。

只有 C++1z 支持是实验性的。

【讨论】:

  • 好吧,这个 experimentalunordered_map 相关是否不好,或者这个类是否已完全实现,我可以使用它并开心吗?
  • @user826955 秒。在 gcc 中对 C++11 的所有支持仍处于试验阶段,但您可以使用它。
  • 请在原帖中查看我的 cmets
【解决方案2】:

如果可以的话,您应该升级到gcc 4.9.2。否则使用gcc 4.4。他们都需要-std=c++0x 选项。

【讨论】:

  • 实际上,4.9.2,你应该使用-std=c++11,而不是0x
猜你喜欢
  • 1970-01-01
  • 2018-10-11
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2011-04-21
相关资源
最近更新 更多