Как внутри работает инициализация List в C++?

Есть класс Test с "говорящими конструкторами". С помощью него проверяю, когда создаются и уничтожаются экземпляры класса:

class Test {
    
public:
    Test()
    {
        cout << "Test hello" << endl;
    }

    ~Test() 
    {
        cout << "Test bye" << endl;
    }

И, соответственно, майн:

int main()
{
Test a, b, c;
   list<Test> lst{ a,b,c };
   cout << "\nlist size 1: " << lst.size() << endl;
   lst.remove(Test());
   cout << "\nlist size 2: " << lst.size() << endl;
}

Вывод такой:

Test hello
Test hello
Test hello
Test bye
Test bye
Test bye
list size 1: 3
Test hello
Test bye
Test bye
Test bye
Test bye
list size 2: 0
Test bye
Test bye
Test bye

Почему когда я добавил элементы в лист, вызвались деструкторы, но сами объекты не удалились? Почему в методе Remove() тоже вызвались деструкторы, но объекты снова не удалились, а так и остались до конца блока? Объясните, пожалуйста, как работает list внутри. Я делал отладку с заходами, но не понял организации.


Ответы (2 шт):

Автор решения: Harry

Добавьте

Test(const Test&)
{
    cout << "Test copy" << endl;
}

и посмотрите на вывод - https://ideone.com/sqCOax

Теперь понятнее?

→ Ссылка
Автор решения: EOF

Давайте разбирать по строкам:

  1. Строка Test a, b, c; создает 3 обьекта класса Test и выводит строки
Test hello
Test hello
Test hello
  1. В строке list<Test> lst{ a,b,c }; обьекты из п. 1 копируются в initializer_list, а из него в сам список (Вы этого не видите, т.к. конструктор копирования ничего не выводит) и удаляются из initializer_list, что Вы и видите в строках
Test bye
Test bye
Test bye
  1. После вывода размера следует строка lst.remove(Test());, в которой есть создание обьекта (Test() - вызов конструктора), что Вы и видите в выводе
Test hello
  1. Т.к. все три обьекта в списке эквивалентны аргументу remove, то они удаляются из списка. Мы это наблюдаем в выводе
Test bye
Test bye
Test bye
  1. После этого удаляется обьект, который Вы передали в remove
Test bye
  1. После второго вывода размера списка, функция main завершается и удаляет все обьекты, которые создала (Ваши обьекты a, b и c), что также наблюдается в выводе
Test bye
Test bye
Test bye
→ Ссылка