Пространства имён
Варианты
Действия

std::initializer_list<T>::initializer_list

Материал из cppreference.com
< cpp‎ | utility
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
initializer_list
(C++11)
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
std::initializer_list
Функции элементы
Ёмкость
Итераторы
Функции не элементы
 
initializer_list() noexcept;
(начиная с C++11)
(до C++14)
constexpr initializer_list() noexcept;
(начиная с C++14)

Объект типа std::initializer_list<T> это облегчённый прокси-объект, который обеспечивает доступ к массиву объектов типа const T.

Объект std::initializer_list создаёт��я автоматически, когда:

std::initializer_list может быть реализован, как пара указателей или указатель и длина. Копирование std::initializer_list не копирует резервный массив соответствующего списка инициализаторов.

Программа некорректна, если объявлена явная или частичная специализация std::initializer_list.

Содержание

[править] Типы элементов

Тип элемента Объявление
value_type T
reference const T&
const_reference const T&
size_type std::size_t
iterator const T*
const_iterator const T*

[править] Функции элементы

создаёт пустой список инициализаторов
(public функция-элемент) [править]
Ёмкость
возвращает количество элементов в списке инициализации
(public функция-элемент) [править]
Итераторы
возвращает указатель на первый элемент
(public функция-элемент) [править]
возвращает указатель на элемент за последним элементом
(public функция-элемент) [править]

[править] Функции не элементы

перегружает std::begin
(шаблон функции) [править]
специализирует std::end
(шаблон функции) [править]
Шаблоны функций, перегруженые для std::initializer_list
возвращает обратный итератор на начало контейнера или массива
(шаблон функции) [править]
(C++14)
возвращает обратный конечный итератор для контейнера или массива
(шаблон функции) [править]
(C++17)
проверяет, пустой ли контейнер
(шаблон функции) [править]
(C++17)
получает указатель на базовый массив
(шаблон функции) [править]

[править] Примечание

Макрос Тестирования функциональности Значение Стандарт Функциональность
__cpp_initializer_lists 200806L (C++11) Список инициализации и std::initializer_list

[править] Пример

#include <initializer_list>
#include <iostream>
#include <vector>
 
template <class T>
struct S {
    std::vector<T> v;
    S(std::initializer_list<T> l) : v(l) {
         std::cout << "сконструирован из " << l.size() << "-элементов списка\n";
    }
    void append(std::initializer_list<T> l) {
        v.insert(v.end(), l.begin(), l.end());
    }
    std::pair<const T*, std::size_t> c_arr() const {
        return {&v[0], v.size()};  // копирование списка инициализации в операторе return
                                   // это НЕ использование std::initializer_list
    }
};
 
template <typename T>
void templated_fn(T) {}
 
int main()
{
    S<int> s = {1, 2, 3, 4, 5}; // копирование списка инициализации
    s.append({6, 7, 8});      // список инициализации при вызове функции
 
    std::cout << "Размер вектора теперь " << s.c_arr().second << " int’ов:\n";
 
    for (auto n : s.v)
        std::cout << n << ' ';
    std::cout << '\n';
 
    std::cout << "Диапазонный for по списоку-инициализации-в-фигурных-скобках: \n";
 
    for (int x : {-1, -2, -3}) // правило для auto делает этот диапазонный for работающим
        std::cout << x << ' ';
    std::cout << '\n';
 
    auto al = {10, 11, 12};   // специальное правило для auto
 
    std::cout << "Список, связанный с auto, имеет size() = " << al.size() << '\n';
 
//    templated_fn({1, 2, 3}); // ошибка компилятора! "{1, 2, 3}" это не выражение,
                             // у него нет типа, и поэтому T не может быть выведен
    templated_fn<std::initializer_list<int>>({1, 2, 3}); // OK
    templated_fn<std::vector<int>>({1, 2, 3});           // также OK
}

Вывод:

сконструирован из 5-элементов списка
Размер вектора теперь 8 int‘ов:
1 2 3 4 5 6 7 8
Диапазонный for по списоку-инициализации-в-фигурных-скобках: 
-1 -2 -3 
Список, связанный с auto, имеет size() = 3

[править] Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 2129 C++11 std::initializer_list может иметь явную или частичную специализацию программа в этом случае некорректна

[править] Смотрите также

(C++20)
не владеющее представление непрерывной последовательности объектов
(шаблон класса) [править]
строковое представление только для чтения
(шаблон класса) [править]