Namespaces
Variants

std::initializer_list

От ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы проверки возможностей библиотеки (C++20)
Утилиты программ
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Реляционные операторы (устарело в C++20)
 
 

(не путать с списком инициализации элементов)

Определён в заголовочном файле <initializer_list>
template< class T >
class initializer_list;
(начиная с C++11)

Объект типа 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 member function)
Capacity
возвращает количество элементов в списке инициализации
(public member function)
Iterators
возвращает указатель на первый элемент
(public member function)
возвращает указатель на элемент, следующий за последним
(public member function)

Функции, не являющиеся членами класса

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

Примечания

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

Пример

#include <cassert>
#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 << "constructed with a " << l.size() << "-element list\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()}; // copy list-initialization in return statement
                                  // this is NOT a use of std::initializer_list
    }
};
template<typename T>
void templated_fn(T) {}
int main()
{
    S<int> s = {1, 2, 3, 4, 5}; // copy list-initialization
    s.append({6, 7, 8});        // list-initialization in function call
    std::cout << "The vector now has " << s.c_arr().second << " ints:\n";    
    for (auto n : s.v)
        std::cout << n << ' ';
    std::cout << '\n';
    std::cout << "Range-for over brace-init-list: \n";
    for (int x : {-1, -2, -3}) // the rule for auto makes this ranged-for work
        std::cout << x << ' ';
    std::cout << '\n';
    auto al = {10, 11, 12}; // special rule for auto
    std::cout << "The list bound to auto has size() = " << al.size() << '\n';
    auto la = al; // a shallow-copy of top-level proxy object
    assert(la.begin() == al.begin()); // guaranteed: backing array is the same
    std::initializer_list<int> il{-3, -2, -1};
    assert(il.begin()[2] == -1); // note the replacement for absent operator[]
    il = al; // shallow-copy
    assert(il.begin() == al.begin()); // guaranteed
//  templated_fn({1, 2, 3}); // compiler error! "{1, 2, 3}" is not an expression,
                             // it has no type, and so T cannot be deduced
    templated_fn<std::initializer_list<int>>({1, 2, 3}); // OK
    templated_fn<std::vector<int>>({1, 2, 3});           // also OK
}

Вывод:

constructed with a 5-element list
The vector now has 8 ints:
1 2 3 4 5 6 7 8
Range-for over brace-init-list:
-1 -2 -3
The list bound to auto has size() = 3

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 2129 C++11 std::initializer_list мог иметь явные
специализации или частичные специализации
программа является
некорректной в этом случае

Смотрите также

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