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