リストをそれ自体とスプライシングする際に問題に直面しています。std::list で splice() とイテレータの無効化を行ったことに注意してください。ここで の質問は、2 つの異なるリストに関するものでした。しかし、私の質問は同じリストについてです。
mylist.splice(mylist.end(), mylist, ++mylist.begin());
gcc 3.x が移動したイテレータを無効にしているようです。したがって、ノードの割り当てを解除して再度割り当てていると思います。これは、同じリストでは意味がありません。SGI は、このバージョンの splice がイテレータを無効にすべきではないと言っています。回避策がある場合、これは gcc 3.x のバグですか?
その間、私は stl_list.h ファイルを調べていました。しかし、transfer() 関数に固執したため、これらの定義が見つかりませんでした。
struct _List_node_base
{
_List_node_base* _M_next; ///< Self-explanatory
_List_node_base* _M_prev; ///< Self-explanatory
static void
swap(_List_node_base& __x, _List_node_base& __y);
void
transfer(_List_node_base * const __first,
_List_node_base * const __last);
void
reverse();
void
hook(_List_node_base * const __position);
void
unhook();
};
これらの関数定義をどこで探すことができますか?