Этот вызов
l1.splice(st, l1, it, it2);
вызывает неопределенное поведение.
Когда вам нужно извлечь диапазон элементов, тогда должны быть обновлены другие элементы данных списка, например size
.
Если вы выполните, например, этот оператор
std::cout << l2.size() << '\n';
, вы можете получить неожиданный результат.
Вот демонстрационная программа, скомпилированная с g cc 8.3.
#include <iostream>
#include <list>
#include <iterator>
int main()
{
std::list<int> lst1 = { 1, 3, 5, 7, 9 };
std::list<int> lst2 = { 0, 2, 4, 6, 8 };
lst1.splice( std::next( std::begin( lst1 ) ),
lst1,
std::begin( lst2 ),
std::end( lst2 ) );
for ( const auto &item : lst1 )
{
std::cout << item << ' ';
}
std::cout << '\n';
for ( const auto &item : lst2 )
{
std::cout << item << ' ';
}
std::cout << '\n';
std::cout << "the size of lst2 is " << lst2.size() << '\n';
return 0;
}
Его вывод будет
1 0 2 4 6 8 3 5 7 9
the size of lst2 is 5
Если вы измените lst1
на lst2
в этом вызове
lst1.splice( std::next( std::begin( lst1 ) ),
lst2, // <===
std::begin( lst2 ),
std::end( lst2 ) );
, то вы получите правильный результат
1 0 2 4 6 8 3 5 7 9
the size of lst2 is 0
^^^