std::initializer_list<T>::initializer_list
Материал из cppreference.com
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
- список-инициализации-в-фигурных-скобках привязан к auto, в том числе в диапазонном цикле 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* |
[править]Функции элементы
создаёт пустой список инициализаторов (public функция-элемент) | |
Ёмкость | |
возвращает количество элементов в списке инициализации (public функция-элемент) | |
Итераторы | |
возвращает указатель на первый элемент (public функция-элемент) | |
возвращает указатель на элемент за последним элементом (public функция-элемент) |
[править]Функции не элементы
перегружает std::begin (шаблон функции) | |
специализирует 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<<"сконструирован из "<< 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) | не владеющее представление непрерывной последовательности объектов (шаблон класса) |
(C++17) | строковое представление только для чтения (шаблон класса) |