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) |
строковое представление только для чтения (шаблон класса) |