Двойной вызов конструктора с std::initializer_list

201
07 октября 2021, 11:50

Почему следующая программа

#include <iostream>
#include <initializer_list>

template<typename T>
struct A {
    A(std::initializer_list<T> list) {
        std::cout << "list" << '\n';
    }
    A(const A& a) {
        std::cout << "copy" << '\n';
    }
    A& operator=(const A& a) {
        std::cout << "copy assignment" << '\n';
        return *this;
    }
    A& operator=(A&& a) noexcept {
        std::cout << "move assignment" << '\n';
        return *this;
    }
};

int main() {
    A<int> a{};
    auto b = A{a,a};
} 

выводит

list

copy

copy

list

?

Answer 1

А что тут неясно?

Первая строка - при создании a, вторая - при подготовке инициализатора для b - копирование двух a, третья - при создании b из списка инициализации...

Answer 2
здесь
int main() {
A<int> a{};
auto b = A{a,a};
}
происходит следующее:
строка   A<int> a{};  - создается лист а, при этом 
         вызывается A(std::initializer_list<T> list) {std::cout << "list" << '\n';}
               выводится "list"
строка   auto b = A{a,a};  - создается лист листов, в который 2 раза добавляется 
                             созданный в предидущей строке а, 
                             так как созданный а - это A<int> (лист)
         поэтому 
            дважды вызывается A(const A& a) {std::cout << "copy" << '\n';}
              при создании 2-х а для A{a,a}
               выводится "copy", "copy"                             
            затем вызывается 
              A(std::initializer_list<T> list) {std::cout << "list" << '\n';}
              при создании самого A{a,a}, который является листом
               выводится "list"
READ ALSO
Объявление std::forward

Объявление std::forward

Почему std::forward объявлён так?

221
Почему и как это работает?(Heap and Stack)

Почему и как это работает?(Heap and Stack)

Правильно ли я понимаю, что массив создается и на куче и на стеке, но как он выбирает, куда ему класть значенияИли он кладет первые три элемента...

63
Загрузка из std::map в шаблон

Загрузка из std::map в шаблон

Сделал частитчно менеджер загрузки спрайтов и моделей 3dЗагружается через load_manager

156
webcomponent почему элемент выпал из потока?

webcomponent почему элемент выпал из потока?

Задача: организовать максимально простое программное добавление/удаление строк в таблицу

141