2012-02-22 24 views
1

我最近想知道當用迭代器調用序列容器操作時(例如insert,erase)的行爲,這些迭代器指向未被調用成員函數的容器控制的元素。要求迭代器引用受控序列中的元素

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

我知道這會導致未定義的行爲,但標準禁止哪裏呢?

(該術語是什麼Dinkumware的文檔中使用,也可用於某些valarray操作標準,雖然我不能與一般的序列容器發現「所控制」。)

回答

4

這不是直接禁止,它只是沒有任何定義的行爲 - 因此UB。

在C++ 11標準此序列容器操作在表100中,其中用於a.erase(q)的先決條件是

q表示有效可提領常量迭代到a

如果定義不是,操作無效。

+0

我看了N3337中的同一張表,但找不到報價。它很好地隱藏在23.2.3/3。 – pmr 2012-02-22 10:05:03