簡體   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