std::initializer_list
(не путать со списком инициализации членов)
Определён в заголовочном файле <initializer_list> | ||
|---|---|---|
template< class T > class initializer_list; | (начиная с C++11) |
Объект типа std::initializer_list<T> — это облегчённый прокси-объект, предоставляющий доступ к массиву объектов типа constT (которые могут быть размещены в памяти только для чтения).
Объект std::initializer_list автоматически создаётся, когда:
- список инициализации в фигурных скобках используется для инициализации списком объекта, а соответствующий конструктор принимает параметр
std::initializer_list, - список инициализации в фигурных скобках используется в качестве правого операнда присваивания или аргумента вызова функции, а соответствующий оператор присваивания/функция принимает параметр
std::initializer_list, - список инициализации в фигурных скобках привязывается к
auto, в том числе в цикле for на основе диапазона.
std::initializer_list может быть реализован как пара указателей или как указатель и длина. Копирование std::initializer_list не копирует массив-основу соответствующего списка инициализации.
Программа некорректна, если объявлена явная или частичная специализация std::initializer_list.
Типы-члены
| Имя | Определение |
|---|---|
value_type |
T |
reference | constT& |
const_reference | constT& |
size_type |
std::size_t |
iterator | constT* |
const_iterator | constT* |
Функции-члены
|
(C++11) | создаёт пустой список инициализации (открытая функция-член) |
Ёмкость |
|
|
(C++11) | возвращает количество элементов в списке инициализации (открытая функция-член) |
|
(C++11) | проверяет, пуст ли std::initializer_list (открытая функция-член) |
Итераторы |
|
|
(C++11) | возвращает указатель на первый элемент (открытая функция-член) |
|
(C++11) | возвращает указатель на элемент, следующий за последним (открытая функция-член) |
|
(C++11) | возвращает указатель на первый элемент (открытая функция-член) |
Функции, не являющиеся членами
Шаблоны свободных функций с перегрузками для |
|
|
(C++14) | возвращает обратный итератор на начало контейнера или массива (шаблон функции) |
|
(C++14) | возвращает обратный итератор конца контейнера или массива (шаблон функции) |
Примечания
| Макрос проверки поддержки функции | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_initializer_lists | 200806L | (C++11) |
Инициализация списком и std::initializer_list |
__cpp_lib_initializer_list | 202511L |
(C++26) (DR11) |
data и empty функции-члены std::initializer_list;удаление ненужных свободных функций для std::initializer_list[1] |
- По состоянию на 2026-05-27 библиотека libstdc++ не рассматривает добавление и удаление функций из P3016R6 как отчёт об исправлении дефекта для C++11 и применяет эти изменения только начиная с C++26.
Пример
#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 | Применён к | Поведение согласно опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 2129 | C++11 |
std::initializer_list мог иметь явныеспециализации или частичные специализации | в этом случае программа некорректна |
| P3016R6 | C++11 |
std::initializer_list имел ненужные функции begin и end, не являющиеся членами | удалены |
См. также
|
(C++20) | невладеющее представление непрерывной последовательности объектов (шаблон класса) |
|
(C++17) | представление строки только для чтения (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/initializer_list