Daily bit(e) C++. std::initializer_list
Добавлено 4 сентября 2023 в 23:04
Daily bit(e) C++ #216. Прокси-объект из C++11 для инициализации с фигурными скобками: std::initializer_list
.
std::initializer_list
(C++11) – это простой прокси-объект для константного массива, который автоматически создается, когда список инициализаторов в скобках:
- используется как аргумент функции;
- используется для инициализации или присвоения объекту с помощью соответствующего конструктора/оператора присваивания;
- привязан к
auto
.
Обратите внимание, что мы не можем перемещать из константного массива, что влияет на производительность.
#include <initializer_list>
#include <vector>
struct X
{
X(std::initializer_list<int>) {}
X& operator=(std::initializer_list<int>){ return *this; }
};
void function(std::initializer_list<int>) {}
struct Data{};
// Создание объекта
X x{1, 2, 3, 4, 5};
// Присваивание объекту
x = {1, 2, 3, 4, 5};
// Функция, явно принимающая initializer_list
function({1, 2, 3, 4, 5});
// Привязка к auto
auto y = {1, 2, 3, 4, 5};
// decltype(y) == std::initializer_list<int>
// инициализация с помощью инициализации копированием
Data a, b;
std::vector<Data> z{a, b};
// 4x копирования
// 2x, чтобы создать std::initializer_list
// 2x, чтобы создать std::vector
// Гарантированное исключение копирования в C++17
std::vector<Data> w{Data{}, Data{}};
// инициализация копированием из pr-значений
// превращается в непосредственную инициализацию
// 2x копирования, чтобы создать std::vector
Открыть пример на Compiler Explorer.