std :: map擦除-将迭代器传递给错误的地图

Dre*_*rew 3 c++ stdmap undefined-behavior language-lawyer

请使用以下C ++代码段:

#include <map>

int main() {
    std::map<int, int> m1;
    m1[1] = 2;

    std::map<int, int> m2;
    m2[3] = 4;
    m1.erase(m2.begin());

    return m2.size();
}
Run Code Online (Sandbox Code Playgroud)

在Godbolt上:https://godbolt.org/z/mJBszn

感觉必须是不确定的行为。那是对的吗?如果是这样,则该标准的哪一部分如此规定?

use*_*301 5

感觉必须是不确定的行为。那是对的吗?

是。

如果是这样,则该标准的哪一部分如此规定?

该标准掴倒在该位的愚蠢[associative.reqmts]注8.我引述n4659,因为这是我有一个链接,靠近C ++ 17。目前,C ++ 20仍然是一个移动的目标。

深入研究[tab:container.assoc.req],我们发现了三个erase带有迭代器的重载,

a.erase(q)
a.erase(r)
a.erase(q1, q2)
Run Code Online (Sandbox Code Playgroud)

其中a.erase(r)一个是问价者感兴趣的东西。

该表仅说明了程序运行时会发生的情况。但是,该表的序言指出:

q表示的有效可取消引用常量迭代器ar表示的有效的可取消引用常量迭代器a,[ q1q2)表示有效的常量迭代器范围,其中a

换句话说,如果迭代器r不是来自map aaend迭代器,或者已被使迭代器无效或使其变得不可参考,则合同将被破坏并且结果将保持不确定。

我包含qq1q2显示规则对于恒定迭代器和迭代器范围是相同的。