繁体   English   中英

负数导致std :: multimap end()迭代器的std :: advance崩溃

[英]std::advance of std::multimap end() iterator by negative number crashes

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

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)); 有用。 这是因为多图的大小类型,但仍然无法猜测是什么原因。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM