【问题标题】:g++4.9 libstdc++ std::string support for C++11 brokeng++4.9 libstdc++ std::string 对 C++11 的支持已损坏
【发布时间】:2014-08-07 00:01:44
【问题描述】:

有谁知道g++ <= 4.9 中的libstdc++ 是否完全符合C++11(或声称符合)?例如,下面的代码无法编译(在 clang 上编译):

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s;

    // g++4.9 bug, returns void
    // instead, according to the standard N3936 21.4.6.4/21
    // should return an iterator (string::iterator or wrapper)
    auto x = s.insert(s.begin(), 10,'A'); 
    cout << s << endl;
}

我正在使用的 std::string::insert 的重载在 21.4.6.4/21 (N3936) 中声明为将迭代器返回到插入的第一个字符

iterator insert(const_iterator p, size_type n, charT c);

但是在上面的代码中它返回void。库的std::string 部分是否不符合要求?我想知道它是否在 g++4.10 上编译。

【问题讨论】:

  • 不,libstdc++ 还没有完全实现 C++11。例如,缺少整个 codecvt 标头。
  • 在一段时间内,std::string 的 libstdc++ 实现不太可能完全符合 c++11。这将需要对实现进行 ABI 不兼容的更改。见:stackoverflow.com/questions/12199710/…
  • 我相信 libc++ 的说法(也许霍华德会看到这一点并证实这一点)。 FWIW,我认为 MSVC 的 stdlib 实现在编译器允许的范围内是完整的。不幸的是,编译器远远落后,这并不能说明什么。
  • N3936 (还)不是标准。这是 C++14 的候选草案。

标签: c++ string c++11 stl


【解决方案1】:

N3936 是 C++14 草案,对于 C++11,最接近的草案标准是 N3337,但在这种情况下,它的返回类型仍然是 iterator,所以问题是一样的。

Praetorian 在他的评论中提供的链接似乎不再包含信息,我无法找到此案例的特定错误报告,但在 libstdc++libc++ 不同意的相关案例中:Does C++11 require allocators to be default constructible, libstdc++ and libc++ disagree?问题是一样的。

std::stringlibstdc++ 实现不完全符合 C++11,但在此 bug report 中,我们可以看到 gcc 5.0 版本应该修复此问题:

已针对 GCC 5 修复(使用新字符串 ABI 时)

我们可以see this live

【讨论】:

    猜你喜欢
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2014-02-21
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    相关资源
    最近更新 更多