【问题标题】:Is GCC 4.8.1 C++11 complete?GCC 4.8.1 C++11 完整吗?
【发布时间】:2013-12-12 03:50:56
【问题描述】:

操作系统是windows。

我首先要说我没有使用 C++ 或任何其他编译语言的经验。我用过一点 CPython 并且对它很熟悉,但是直到今天早些时候,我什至从未看过 C++ 源代码。

我正在尝试自学 C++,所以我一直在玩它,我遇到的一个问题是错误:

error: 'to_string' was not declared in this scope

显然,to_string 是 C++11 的东西,应该没问题。我下载了最新的 MinGW,将其添加到我的路径中 - 我已检查并正在运行

g++ - v

确实告诉我我安装了 4.8.1 版。我正在使用的 IDE,Code::Blocks 发现它没有问题,但它根本不会使用任何 C++11 的东西,给我上面的错误。非 C++11 独有的东西编译得很好。

编译器标志下有一个部分用于“遵循 C++11 语言标准”,我已经检查过了,但即便如此,我也会遇到同样的错误。我真的不确定发生了什么 - 我已经查过了,所有的建议都是更新 IDE 或 MinGW(两者都是最新的),或者选择那个标志,正如我说,已经被选中了。

有更多 C++ 经验的人知道会发生什么吗?b

【问题讨论】:

  • 你设置-std=c++11了吗?另外,stackoverflow.com/q/12975341/1619294
  • 可能您忘记了std::using namespace std; 或忘记包含<string>
  • @Mark,这不是我提到的编译器标志吗?此外,根据您的链接,这已在(截至当时)更新的版本中修复。
  • @pyCthon - 我已经用 ideone 在线测试了我的代码,它没有问题。所以这绝对不是命名空间问题。
  • @Kevin 看起来它已经在 mingw trunk sourceforge.net/apps/trac/mingw-w64/wiki/to_string 中修复了

标签: c++ c++11 mingw codeblocks


【解决方案1】:

我的理解是,除了 regex 支持之外,G++ 的 C++11 支持在 4.8.1 中基本完成。

以下两个链接突出显示了 G++ 4.8.1 和 libstdc++ 中 C++11 支持的状态:

不过,要编译 C++11 代码,您需要在编译时包含命令行标志 -std=c++11

【讨论】:

  • 核心语言是完整的,但是库中缺少很多东西(Unicode转换可能是最突出的)
  • @Cubbi :很高兴知道。我在那里放了一些链接到涵盖 C++11 的 GCC 4.8.x 和 libstdc++ 状态页面。希望这些也有帮助。
  • g++ 4.8系列核心语言不完整。它没有正确处理右值引用。
【解决方案2】:

g++ 4.8 系列在核心语言方面并不完整。以下代码使用 g++ 4.9 及更高版本(以及 clang++ 3.3 及更高版本)编译和运行,但不适用于 g++ 4.8.5(或 g++ 4.8 系列的任何先前成员)。

#include <iostream>

void ordinary_function (int&)  { std::cout << "ordinary_function(int&)\n"; }   

void ordinary_function (int&&) { std::cout << "ordinary_function(int&&)\n"; }   

template<class T>
void template_function (T&)  { std::cout << "template_function(T&)\n"; }   

template<class T>
void template_function (T&&) { std::cout << "template_function(T&&)\n"; }   

int main () {   
    int i = 42; 
    ordinary_function(42); // Not ambiguous.
    ordinary_function(i);  // Not ambiguous.
    template_function(42); // Not ambiguous.
    template_function(i);  // Ambiguous in g++4.8.
}   

【讨论】:

    【解决方案3】:

    std::string 不兼容;它仍然使用遗留(尤其是线程问题)“写入时复制”行为。您也许可以使用 __gnu_cxx::__vstring 作为解决方法。

    “类模板basic_string部分不符合Copy-On-Write实现”

    http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x https://gcc.gnu.org/bugzilla/show_bug.cgi?id=21334

    相关:Does g++ meets std::string C++11 requirements

    【讨论】:

      【解决方案4】:

      std::stringstd::list 的行为不符合 C++11 标准。 libstdc++ 的文档在这里 [https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html] 名为 _GLIBCXX_USE_CXX11_ABI 的宏可以控制它们在 GCC5/更高版本中的行为。

      此外,GCC-4.8 中的 C++11 std::function 与 GCC-5 及更高版本不同,没有宏可以控制 std::function 的行为。 [Undocumented ABI changes of std::function between GCC-4 and GCC-5/6/7/8/9, how to make a .so working with devtoolset-4/6/7/8/9?]

      GCC-4.8 中的 C++11 被认为是实验性支持,所以不要太依赖它。

      【讨论】:

        猜你喜欢
        • 2013-09-27
        • 2013-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多