我最近想知道,当使用迭代器调用时,修改序列容器操作(例如insert
、erase
)的行为,迭代器引用的元素不受调用其成员函数的容器控制。
int main() {
std::vector<int> a = {1,2,3}, b = {1,2,3};
a.erase(b.begin());
}
我知道这会导致不明确的行为,但标准到底在哪里禁止这种行为?
("受控者"术语是Dinkumware文档中使用的术语,也用于某些valarray
操作的标准中,尽管我在通用序列容器中找不到它。)
它不是直接禁止的,只是没有任何定义的行为-因此是UB。
在C++11标准中,该序列容器操作在表100中定义,其中a.erase(q)
的前提条件是
q
表示a
的有效可解引用常量迭代器
如果不是,则操作无效。