std::optional
| Определён в заголовочном файле <optional>
|
||
template< class T >
class optional;
|
(начиная с C++17) | |
Шаблон класса std::optional управляет опциональным содержащимся значением, то есть значением, которое может присутствовать или отсутствовать.
Обычный вариант использования optional — возвращаемое значение функции, которая может завершиться ошибкой. В отличие от других подходов, таких как std::pair<T, bool>, optional хорошо обрабатывает объекты, дорогие в конструировании, и более читаем, так как намерение выражается явно.
Любой экземпляр optional в любой момент времени либо содержит значение, либо не содержит значение.
Если optional содержит значение, это значение гарантированно размещается внутри объекта optional. Таким образом, объект optional моделирует объект, а не указатель, хотя operator*() и operator->() определены.
Когда объект типа optional<T> неявно преобразуется в bool, преобразование возвращает true, если объект содержит значение, и false, если он не содержит значение.
Объект optional содержит значение в следующих условиях:
- Объект инициализирован/присвоен из значения типа
Tили другогоoptional, содержащего значение.
Объект не содержит значение в следующих условиях:
- Объект инициализирован по умолчанию.
- Объект инициализирован/присвоен из значения типа std::nullopt_t или объекта
optional, который не содержит значения. - Вызвана функция-элемент reset().
|
Объект |
(начиная с C++26) |
Не существует опциональных ссылок, функций, массивов или (возможно, cv-квалифицированных) void; программа является некорректной (ill-formed), если она инстанцирует optional с таким типом. Кроме того, программа является некорректной, если она инстанцирует optional с (возможно, cv-квалифицированными) типами-тегами std::nullopt_t или std::in_place_t.
Параметры шаблона
| T | - | тип значения, для которого управляется состоянием инициализации. Тип должен удовлетворять требованиям Destructible (в частности, массивы и ссылочные типы не допускаются). |
Вложенные типы
| Тип | Определение |
value_type
|
T
|
iterator
(since C++26)
|
определяемый реализацией
LegacyRandomAccessIterator
,
ConstexprIterator
, и
contiguous_iterator
, у которого
value_type
и
reference
являются
std::
remove_cv_t
<
T
>
и
T
&
, соответственно.
|
const_iterator
(since C++26)
|
определяемый реализацией
LegacyRandomAccessIterator
,
ConstexprIterator
, и
contiguous_iterator
, у которого
value_type
и
reference
являются
std::
remove_cv_t
<
T
>
и
const
T
&
, соответственно.
|
Все требования к типам итераторов для
Container
также применяются к типу
iterator
в
optional
.
Члены данных
T*
val
|
указатель на содержащийся объект (если существует)
( объект-член только для демонстрации* ) |
Функции-члены
создает объект
optional
(публичная функция-член) |
|
|
уничтожает содержащееся значение, если оно есть
(публичная функция-член) |
|
|
присваивает содержимое
(публичная функция-член) |
|
Итераторы |
|
|
(C++26)
|
возвращает итератор на начало
(публичная функция-член) |
|
(C++26)
|
возвращает итератор на конец
(публичная функция-член) |
Наблюдатели |
|
|
получает доступ к содержащемуся значению
(публичная функция-член) |
|
|
проверяет, содержит ли объект значение
(публичная функция-член) |
|
|
возвращает содержащееся значение
(публичная функция-член) |
|
|
возвращает содержащееся значение, если оно доступно, иначе другое значение
(публичная функция-член) |
|
Монадические операции |
|
|
(C++23)
|
возвращает результат заданной функции для содержащегося значения, если оно существует, или пустой
optional
в противном случае
(публичная функция-член) |
|
(C++23)
|
возвращает
optional
содержащий преобразованное значение, если оно существует, или пустой
optional
в противном случае
(публичная функция-член) |
|
(C++23)
|
возвращает сам
optional
если он содержит значение, или результат заданной функции в противном случае
(публичная функция-член) |
Модификаторы |
|
|
обменивает содержимое
(публичная функция-член) |
|
|
уничтожает любое содержащееся значение
(публичная функция-член) |
|
|
создает содержащееся значение на месте
(публичная функция-член) |
|
Функции, не являющиеся членами класса
|
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++20)
|
сравнивает объекты
optional
(шаблон функции) |
|
(C++17)
|
создает объект
optional
(шаблон функции) |
|
(C++17)
|
специализирует алгоритм
std::swap
(шаблон функции) |
Вспомогательные классы
|
(C++17)
|
поддержка хеширования для
std::optional
(специализация шаблона класса) |
|
(C++17)
|
индикатор для
std::optional
, который не содержит значения
(класс) |
|
(C++17)
|
исключение, указывающее на проверенный доступ к optional, который не содержит значения
(класс) |
Вспомогательные средства
|
(C++17)
|
объект типа
nullopt_t
(константа) |
|
тег для конструирования на месте
(тег) |
Вспомогательные специализации
|
template
<
class
T
>
constexpr bool ranges:: enable_view < std :: optional < T >> = true ; |
(начиная с C++26) | |
Эта специализация
ranges::enable_view
позволяет
optional
удовлетворять требованиям
view
.
|
template
<
class
T
>
constexpr auto format_kind < std :: optional < T >> = range_format :: disabled ; |
(начиная с C++26) | |
Эта специализация
format_kind
отключает
поддержку форматирования диапазонов
для
optional
.
Руководства по выводу типа
Примечания
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_optional
|
201606L
|
(C++17) |
std::optional
|
202106L
|
(C++23)
(DR20) |
Полностью constexpr | |
202110L
|
(C++23) | Монадные операции | |
__cpp_lib_optional_range_support
|
202406L
|
(C++26) |
Поддержка диапазонов для
std::optional
|
Пример
#include <iostream> #include <optional> #include <string> // optional может использоваться как тип возвращаемого значения фабрики, которая может завершиться неудачей std::optional<std::string> create(bool b) { if (b) return "Godzilla"; return {}; } // std::nullopt может использоваться для создания любого (пустого) std::optional auto create2(bool b) { return b ? std::optional<std::string>{"Godzilla"} : std::nullopt; } int main() { std::cout << "create(false) returned " << create(false).value_or("empty") << '\n'; // фабричные функции, возвращающие optional, могут использоваться как условия в while и if if (auto str = create2(true)) std::cout << "create2(true) returned " << *str << '\n'; }
Вывод:
create(false) returned empty create2(true) returned Godzilla
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 4141 | C++17 |
требование к выделению памяти
было запутанным |
содержащийся объект должен быть
вложен в объект
optional
|
Смотрите также
|
(C++17)
|
типобезопасное размеченное объединение
(шаблон класса) |
|
(C++17)
|
объекты, содержащие экземпляры любого
CopyConstructible
типа
(класс) |
|
(C++23)
|
обёртка, содержащая либо ожидаемое, либо ошибочное значение
(шаблон класса) |
view
содержащий единственный элемент указанного значения
(шаблон класса) (объект точки настройки) |
|
|
(C++20)
|
пустой
view
без элементов
(шаблон класса) (шаблон переменной) |