次のことを行うことは有効ですか、それとも未定義ですか。
int main()
{
std::list<int> a = { 10 };
auto it = std::prev(a.begin()); // potential out of bounds here
std::list<int> b;
b.splice(b.begin(), a);
a.push_back(12);
std::cout << *std::next(it);
return 0;
}
基本的に、リストから要素を削除するときに、リスト内の削除された場所を参照できるように、オブジェクトを指すイテレータを取得して、本来あるべき場所に挿入できるようにしたいと考えています。そこに要素がないため、リストの最初の要素を削除すると問題が発生します。私はいくつかの実装の詳細を読みましたが、ほとんどの場合、イテレータが逆参照されない限り有効であると思われます。
GCC/CLang では動作するようですが、VC++ ではデバッグ警告が表示されます。
編集:
私が何を目指しているのかを明確にするために、リストのセクターを相互にスプライスできるようにスプライス関数の実装が必要です...
// Note not valid code... really just a concept of what I need...
std::list<int> a = { 10, 20, 30, 40 };
std::list<int> b = { 2, 4, 6, 8 };
auto b1 = std::advance(a.begin(), 1);
auto e1 = std::advance(a.end(), -2);
auto b2 = b.begin();
auto e2 = b.end();
a.splice(b1, e1, b, b2, e2);
// a = { 10, 2, 4, 6, 8, 40 }
// b = { 20, 30 }
b.splice(b1, e1, a, b2, e2);
// a = { 10, 20, 30, 40 }
// b = { 2, 4, 6, 8 };