Namespaces
Variants

std:: initializer_list

From cppreference.net
Utilities library

(не следует путать с member initializer list )

Определено в заголовке <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)
непредставляющее владение представление непрерывной последовательности объектов
(шаблон класса)
представление строки только для чтения
(шаблон класса)