g ++ 4.9 libstdc ++ std :: string支持C ++ 11破解

时间:2014-08-07 00:01:45

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

有人知道libstdc++中的g++ <= 4.9是否完全符合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 I的重载在21.4.6.4/21(N3936)中声明为将迭代器返回到插入的第一个字符

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

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

1 个答案:

答案 0 :(得分:1)

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

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

<libstdc++ std::string的实施并不完全符合C ++ 11,但在bug report我们可以看到,gcc 5.0版本应该修复:

  

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

我们可以see this live