2012-02-22 7 views
1

私は最近、メンバ関数が呼び出されたコンテナによって制御されていない要素を参照するイテレータで呼び出されたときにシーケンスコンテナの操作(例:inserterase) 。イテレータが制御されたシーケンスの要素を参照するための要件

int main() { 
    std::vector<int> a = {1,2,3}, b = {1,2,3}; 
    a.erase(b.begin()); 
} 

私は、これは未定義の動作につながることを知っているが、場所を正確に、これは標準で禁止されていますか?

(用語「によって制御」Dinkumwareのマニュアルで使用されているものであると私は一般的なシーケンスコンテナでそれを見つけることができませんでしたが、いくつかのvalarray操作のための標準でも使用されている。)

答えて

4

それはではありません直接が禁止されているだけで、定義された動作がないため、UBです。 a.erase(q)ための前提条件が

qa

そして場合に有効dereferenceable CONST反復子を意味している。このシーケンスコンテナ操作が表100に定義されているC++ 11標準において

そうではありません、操作は有効ではありません。

+0

N3337の同じテーブルを見ましたが、見積もりが見つかりませんでした。それは23.2.3/3によく隠されている。 – pmr

関連する問題