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

何が問題ですか?

-(mm.size() - 7)編集:クラッシュしなかった代わりに-1だけを書いたとき、なぜですか? mm.size() をデバッグするときは 8 であることを考慮してください。

EDIT 2:私が書くとき、std::advance(it, -(static_cast<int>(scoresMap.size()) - 7));それは動作します。マルチマップのサイズタイプが原因ですが、何が原因かはまだ推測できません。

4

1 に答える 1

2

この式(mm.size() - 7)は、符号なし値 std::size_t を生成します。次に、符号なしの値が否定され、最近の C++ ドラフト仕様 (N3690) に従って:

単項 - 演算子のオペランドは、算術またはスコープなしの列挙型を持ち、結果はそのオペランドの否定になります。整数昇格は、整数オペランドまたは列挙オペランドに対して実行されます。符号なし量の負数は、その値を 2 nから減算することによって計算されます。ここで、n はプロモートされたオペランドのビット数です。結果の型は、プロモートされたオペランドの型です。

提供される値は、符号なし型の否定規則により、std::advanceより大きな値に変換される可能性があります。mm.size()

編集の 2 番目の式 はstatic_cast<int>(scoresMap.size() - 7)、値を符号付きの int 型に変更します。その値を否定すると目的の値が得られますが、 より大きい値を返すstatic_cast場合、 は未定義の動作をします。scoresMap.size() - 7std::numeric_limits<int>::max()

于 2014-05-29T02:41:12.583 に答える