gpt4 book ai didi

c++ - std::advance of std::multimap end() 迭代器负数崩溃

转载 作者:行者123 更新时间:2023-11-30 04:04:05 24 4
gpt4 key购买 nike

我的应用在此操作时崩溃了:

std::multimap<int, std::string, std::greater<int>> mm;
// insert elements
auto it = mm.end();
std::advance(it, -(mm.size() - 7));

这是崩溃的消息:

Expression: map/set iterator not incrementable

问题是什么?

编辑:当我只写 -1 而不是 -(mm.size() - 7) 时它没有崩溃,为什么?请考虑当我调试时 mm.size() 是 8。

编辑 2:当我写 std::advance(it, -(static_cast<int>(scoresMap.size()) - 7));有用。是因为multimap的size type,但是还是猜不出是什么原因。

最佳答案

表达式 (mm.size() - 7)产生一个无符号值,std::size_t。然后取反无符号值,根据最近的 C++ 规范草案 (N3690):

The operand of the unary - operator shall have arithmetic or unscoped enumeration type and the result is the negation of its operand. Integral promotion is performed on integral or enumeration operands. The negative of an unsigned quantity is computed by subtracting its value from 2n, where n is the number of bits in the promoted operand. The type of the result is the type of the promoted operand.

提供给 std::advance 的值可以转换为大于 mm.size() 的值由于无符号类型的否定规则。

您编辑中的第二个表达式,static_cast<int>(scoresMap.size() - 7) ,将值更改为有符号类型 int。否定该值将获得所需的值,但是,static_cast有未定义的行为如果 scoresMap.size() - 7返回大于 std::numeric_limits<int>::max() 的值.

关于c++ - std::advance of std::multimap end() 迭代器负数崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23924602/

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