Daily bit(e) C++. std::initializer_list

Добавлено 4 сентября 2023 в 23:04

Daily bit(e) C++ #216. Прокси-объект из C++11 для инициализации с фигурными скобками: std::initializer_list.

Daily bit(e) C++. 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.

Теги

C++ / CppDaily bit(e) C++STL / Standard Template Library / Стандартная библиотека шаблоновПрограммированиеСписок инициализаторов

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.