2つのstd::map<>
オブジェクトがa
ありb
、いくつかの述語に基づいて、1つのマップから別のマップにいくつかの要素(ノード)を移動(extract
+ insert
)したいと思いp
ます。
for (auto i = a.begin(); i != a.end(); ++i)
if (p(*i))
b.insert(a.extract(i))
このコードはclangでsegfaultします。問題は、i
ノードがaから抽出された後のの増加であると思います。
ポストインクリメントを使用してこれを修正する正しい/唯一の方法はありますか?例:
for (auto i = a.begin(); i != a.end();)
if (p(*i))
b.insert(a.extract(i++))
else
++i;
編集:現在の設定ではこれを再現できないため、「gccで動作する理由」に関する部分を削除しました。ある時点でそれが以前は使用されていたと確信していますが、gcc 9.2.1では(segfaultの代わりに)デッドロックが発生します。いずれにしても、後の増分extract()
は機能しません。
2
関連または
—
重複
どのバージョンのclangおよびgccを使用しましたか?私にとって、clang 8.0とgcc 7.4を使用すると、どちらもsegfaultが発生します。
—
バラージュKovacsics
このコードがどのコンパイラでも機能することに驚いています。抽出による無効化を処理していない
—
Iman Kianrostami