【问题标题】:using c++0x - safe?使用 c++0x - 安全吗?
【发布时间】:2012-01-05 11:48:52
【问题描述】:

我想使用 stl hashmap,除其他外,我发现 c++ 没有它,但 c++0x 有 - 所以作为不是最新的人 - c++0x 可以安全使用? (它是否已经经过全面测试并且可以指望相对没有错误?)。如果是这样-似乎有很多较新的版本(c ++ 11)-我应该使用它们,还是它们仍然不够可靠。实际上无论如何,当我尝试使用新界面中的某些东西时,我的 linux 编译器告诉我必须包含 c++0x - 所以我想我的编译器不是最新的 enoug

【问题讨论】:

  • 安全对您意味着什么? C++ 程序不安全;他们可以而且确实会崩溃。像 Ocaml 或 Haskell 这样的强类型语言更安全。
  • GCC 4.6 支持 C++0x。
  • C++11 是一个标准(也就是说,一个 PDF 文档),而不是一个可以“被测试”或“有 bug”的实际实现。假设你的 linux 编译器是 GCC,它支持 C++11 的各个部分。使用--std=c++0x 开启部分支持。那里可能没有非常错误,但不一定符合标准。因此,如果您认为缺少的功能是错误,那么它就是错误的。
  • 您可以在此处检查各种编译器对 c++0x 的支持:wiki.apache.org/stdcxx/C++0xCompilerSupport
  • @Basile :我没有使用“安全”这个词,我说的是“强类型”——C++ 强类型的。

标签: c++ c++11 hashmap


【解决方案1】:

C++0x 是 C++11 的暂定名称。

标签info 页面中查找您的编译器版本,了解它对新功能的支持。

长话短说:GCC 遥遥领先,但仍然没有 100% 的功能。一些东西比如用户定义的文字还没有被任何编译器支持。 (编辑:我不确定,但我认为正则表达式和原子内存模型的一些特性属于这一类。)右值引用等基本特性非常完整。

std::unordered_map 由 C++03 TR1 引入,所有 C++11 实现以及所有现代 C++03 实现都通过其 TR1 库支持,即使没有 C++11 语言支持。在 TR1 下,模板名为 std::tr1::unordered_map,您可能需要采取一些特定于平台的步骤来启用 TR1,例如将一些 tr1/ 子目录添加到包含文件搜索路径。

【讨论】:

  • 其实 GCC 确实支持用户自定义字面量,见GCC 4.7 C++11 status
  • @Basile: ... GCC 中的所有 C++11 支持都标记为“实验性”。在实践中,使用最先进的编译器可能会解决比它产生的问题更多的问题,尤其是在使用最先进的 C++ 结构时。 (但unordered_map 根本不需要 C++11 或任何升级。令人困惑的接受答案的选择,在这里……)
【解决方案2】:

是的,它应该是安全的。但是 - 就像您已经看到的那样 - 只有 C++11 标准的一部分在各种编译器中实现。尝试获取最新的 gcc,它实现了 C++11 的大部分功能:http://gcc.gnu.org/projects/cxx0x.html

【讨论】:

    【解决方案3】:

    对于非安全关键型应用程序应该是安全的。我认为目前还没有支持 C++0x 的安全关键型编译器。

    但是,对于桌面应用程序,您应该没有问题。但请注意,只有少数编译器支持 C++0x(afak gcc 4.6+ 和 VC 2010),它们并不支持所有功能。请务必阅读编译器规范以检查它们支持和不支持的内容。

    我宁愿等待这些编译器的更新版本在商业应用中使用它。

    【讨论】:

    • 对于 gcc 它不是 4.6。 Gcc 逐渐添加了 c++11 的各个部分。第一个 c++11 特性已经出现在 4.3 中,4.7 仍然不支持所有这些特性。此外,gcc 还可以与 GNU stdlibc++ 之外的其他标准库实现一起使用,因此其他一些功能取决于您使用的库。
    【解决方案4】:

    没有 C++0x。这是最终在 2011 年 8 月 12 日成为 C++11 的工作名称。

    该标准包含许多单独起草的部分,编译器甚至在标准最终确定之前就开始单独支持它们,但另一方面,有些部分根本不受支持。所以你需要检查你的编译器是否支持你想要使用的特性。

    现在是std::unordered_map 的特殊情况,它首先在C++ TR1 中标准化,但早在boost 中就起源于它。大多数不支持 C++11 的编译器都支持 TR1,所以std::tr1::unordered_map 会在那里,对于不支持的编译器,您总是可以从 boost 中获取它。

    至于gcc,错误是你需要启用 C++11。只需将-std=c++0x 选项添加到编译器命令行即可完成。这样做是为了避免在您仍然关心 C++03 编译器可移植性的代码中意外使用 C++11 功能。

    【讨论】:

    • 在 Boost 之前,它在 STL 中......正如 OP 提到的 :vP 。请注意,不同的编译器访问 TR1 的方式不同,因此在 GCC 中需要 #include <tr1/unordered_map>,在 MSVC 中需要 #include <unordered_map>,而对于其他编译器,它有助于 RTFM。
    • @Potatoswatter: unordered_map 从未在 STL 中,虽然“STL”的大多数实现都包含一些 hashmap 类,但它们是相互不兼容的(例如,Microsoft 的版本需要订购密钥等) .
    • STL 是源自标准容器库的特定实现的名称。查看标题中的版权信息……它可能提到了 HP 和 SGI。我的 GCC 4.7 副本仍然在 backward/ 目录中提供 hash_map,并且仍然注明版权 SGI,使其成为 STL 的一部分。
    • @Potatoswatter: hash_map 是 STL 的一部分。我不确定它是否与unordered_map 完全兼容(这绝对不是 STL 的一部分),并且我确定hash_map 的变体(在“STL”的实现中,即重新实现原始 STL 的库)不兼容STL 之一,这也是 TR1 引入新名称的部分原因。
    • 是的,TR1 引入了新名称……但您说,模板“早在 boost 中就出现了”。起源早在 Boost 之前。无论如何,我认为我们都了解历史。
    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2010-12-31
    • 2011-10-07
    • 1970-01-01
    • 2021-01-10
    • 2022-11-16
    • 2011-04-17
    相关资源
    最近更新 更多