4

根据C++ 参考STL 容器在 C++11 标准中被修复以在erase方法中采用常量迭代器。以下代码在c++0x启用时无法在 g++4.7 中编译。

#include <vector>

int main()
{
    std::vector<int> vector;
    vector.push_back(0);

    std::vector<int>::const_iterator vectorItr = vector.begin();
    vector.erase(vectorItr);
}

显然,新的签名没有实现。是否有任何信息何时修复此问题?我在 GCC文章中的C++0x/C++11 支持中找不到任何相关信息。

4

5 回答 5

4

这里

部分: 23.3.6
描述:类模板向量
状态: 部分
注释:插入和擦除成员不采用 const_iterator 参数 (N2350)。

于 2013-06-07T06:53:17.977 回答
4

值得一提的是:我刚才针对 GCC 4.8.1 和 GCC 4.9(20130602 快照)对此进行了测试,结果是 4.8.1 仍然存在这个问题(请注意,承诺的 C++11 合规性是与语言核心相关,而不是标准库),但 4.9 快照可以正确编译它。

所以我想假设 GCC 4.9 一旦发布,将按照标准的规定处理这个问题是公平的。

于 2013-06-07T06:57:42.310 回答
3

看看 gcc 的库实现状态。那里清楚地指出,有问题的功能尚未实现:

23.3.6 - 类模板向量 - 部分 - 插入和擦除成员不采用 const_iterator 参数 (N2350)。

于 2013-06-07T06:53:37.277 回答
2

不出所料:因为它似乎还没有实现(即使在 C++11 模式下)。

最简单的检查方法是查看std::vector. 尽管其中大部分内容可能非常晦涩难懂,但方法签名通常很容易阅读。

于 2013-06-07T06:46:36.907 回答
1

GCC 4.8(不是 4.7)中给出了完整的 C++11 合规性。

由于 4.7 未被授予完全兼容,因此不能将其视为(严格的技术术语)“错误”。可能是需要与尚不兼容的其他库模块保持一些兼容性。

如果这发生在 4.8 中,那么它必须被视为一个错误。但不是在 4.7

于 2013-06-07T06:52:59.413 回答