【发布时间】: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 的候选草案。