std::initializer_list<T>::initializer_list
Материал из cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev ">
</tbody><tbody>
</tbody>
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) |
строковое представление только для чтения (шаблон класса) |