gpt4 book ai didi

c++ - std::map erase - 将迭代器传递给错误的 map

转载 作者:太空狗 更新时间:2023-10-29 19:55:56 24 4
gpt4 key购买 nike

以这段 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();
}

关于神 bolt :https://godbolt.org/z/mJBszn

这感觉一定是未定义的行为。那是对的吗?如果是这样,标准的哪一部分是这样说的?

最佳答案

This feels like it must be undefined behaviour. Is that correct?

是的。

If so, which part of the standard says so?

标准在 [associative.reqmts] 注释 8 中消除了这一点愚蠢。我是 citing n4659因为这是我与 C++17 的链接和接近。目前,C++20 仍然是一个移动的目标。

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

a.erase(q)
a.erase(r)
a.erase(q1, q2)

其中 a.erase(r) 是提问者感兴趣的。

该表仅说明程序运行时会发生什么;然而,该表的序言指出

q denotes a valid dereferenceable constant iterator to a, r denotes a valid dereferenceable iterator to a, [q1, q2) denotes a valid range of constant iterators in a

也就是说,如果迭代器r不是来自map aaend 迭代器,或者已失效或以其他方式呈现为不可引用,契约(Contract)被破坏并且结果未定义。

我包括 qq1q2 以显示规则对于常量迭代器和迭代器范围是相同的。

关于c++ - std::map erase - 将迭代器传递给错误的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57584081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com