Почему следующая программа
#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
?
А что тут неясно?
Первая строка - при создании a, вторая - при подготовке инициализатора для b - копирование двух a, третья - при создании b из списка инициализации...
здесь
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"
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости