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
感觉必须是不确定的行为。那是对的吗?如果是这样,则该标准的哪一部分如此规定?
感觉必须是不确定的行为。那是对的吗?
是。
如果是这样,则该标准的哪一部分如此规定?
该标准掴倒在该位的愚蠢[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表示的有效可取消引用常量迭代器a,r表示的有效的可取消引用常量迭代器a,[q1,q2)表示有效的常量迭代器范围,其中a
换句话说,如果迭代器r不是来自map a,a的end迭代器,或者已被使迭代器无效或使其变得不可参考,则合同将被破坏并且结果将保持不确定。
我包含q,q1并q2显示规则对于恒定迭代器和迭代器范围是相同的。
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |