1

我的应用程序在此操作中崩溃:

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的大小类型,但仍然无法猜测是什么原因。

4

1 回答 1

2

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

一元 - 运算符的操作数应具有算术或无范围枚举类型,结果是其操作数的否定。对整数或枚举操作数执行整数提升。无符号量的负数是通过从 2 n中减去其值来计算的,其中 n 是提升的操作数中的位数。结果的类型是提升的操作数的类型。

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

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

于 2014-05-29T02:41:12.583 回答