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

価値があること: 私はこれを GCC 4.8.1 と GCC 4.9 (20130602 スナップショット) に対してテストしましたが、その結果、4.8.1 にはまだこの問題があります (約束された C++11 準拠は標準ライブラリではなく、言語コアに関連しています) が、4.9 スナップショットはそれを正しくコンパイルします。

したがって、GCC 4.9 がリリースされれば、標準で指定されたとおりにこれを処理すると想定するのが妥当だと思います。

于 2013-06-07T06:57:42.310 に答える
4

ここで:

セクション: 23.3.6
説明:クラス テンプレート ベクトル
ステータス: 一部
コメント:挿入メンバーと消去メンバーは const_iterator 引数を取りません (N2350)。

于 2013-06-07T06:53:17.977 に答える
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

完全な C++11 準拠は、GCC 4.8 (4.7 ではありません) で提供されます。

4.7 は完全に準拠していると認められていないため、これを (厳密な技術用語では) 「エラー」と見なすことはできません。まだ準拠していない他のライブラリ モジュールとの互換性を維持する必要があったのかもしれません。

これが 4.8 で発生する場合は、バグと見なす必要があります。しかし、4.7ではありません

于 2013-06-07T06:52:59.413 に答える