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() .
|
Объект
|
(since C++26) |
Не существует опциональных ссылок, функций, массивов или (возможно, cv-квалифицированного)
void
; программа является некорректной, если создаёт экземпляр
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
без элементов
(шаблон класса) (шаблон переменной) |