std::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, - привязки списка инициализации к
auto, включая в цикле ranged for.
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* |
Члены-функции
| создаёт пустой список инициализации (публичная функция-член) |
|
Ёмкость |
|
| возвращает количество элементов в списке инициализации (публичная функция-член) |
|
Итераторы |
|
| возвращает указатель на первый элемент (публичная функция-член) |
|
| возвращает указатель на элемент, следующий за последним (публичная функция-член) |
|
Функции вне класса
|
(C++11) | перегрузка std::begin (шаблон функции) |
|
(C++11) | специализация std::end (шаблон функции) |
Шаблоны свободных функций, перегруженные для |
|
|
(C++14) | возвращает обратный итератор в начало контейнера или массива (шаблон функции) |
|
(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 << "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';
// 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++.
| Отчёт об ошибке | Применимо к | Поведение, опубликованное в документе | Правильное поведение |
|---|---|---|---|
| LWG 2129 | C++11 |
std::initializer_list могли иметь явныеспециализации или частичные специализации | программа в этом случае некорректна |
См. также
|
(C++20) | невладеющий вид на непрерывную последовательность объектов (шаблон класса) |
|
(C++17) | просмотр строки только для чтения (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/initializer_list