std::optional
Определено в заголовочном файле <optional>
|
||
template< class T > class optional; |
(начиная с C++17) | |
Шаблонный класс std::optional
управляет необязательным содержащимся значением, то есть значением, которое может присутствовать или отсутствовать.
Можно использовать optional
как возвращаемое значение функции, которая может потерпеть неудачу, или как необязательное поле типа. В отличие от других подходов, вроде std::pair<T,bool>, optional
хорошо обрабатывает дорогостоящие в построении объекты и является более читабельным, поскольку намерение выражено явно.
Любой экземпляр optional<T>
в любой данный момент времени либо содержит значение, либо пуст.
Если optional<T>
содержит значение, это значение гарантированно будет выделено в составе optional
, то есть динамическое выделение памяти никогда не происходит. Таким образом optional
объект моделирует объект, а не указатель, даже если определены operator*() и operator->().
Когда объект типа optional<T> контекстно преобразован в bool, преобразование возвращает true, если объект содержит значение, и false, если он не содержит значения.
Объект optional
содержит значение при следующих условиях:
- Объект был инициализирован или присвоен из значения типа
T
или другогоoptional
, который содержит значение.
Объект optional
не содержит значения при следующих условиях:
- Объект был инициализирован по умолчанию.
- Объект был инициализирован или присвоен из значения типа std::nullopt_t (std::nullopt) или объекта
optional
, который не содержит значения. - Была вызвана функция-элемент reset().
Нет optional
ссылок; программа некорректна, если она создаёт экземпляр optional
со ссылочным типом. Кроме того, программа некорректна, если она создаёт экземпляр optional
с (возможно, cv-квалифицированными) тэгами типов std::nullopt_t или std::in_place_t.
Содержание |
[править] Параметры шаблона
T | — | тип значения, для которого нужно управлять состоянием инициализации. Тип должен быть Destructible (в частности, типы массивов и ссылочные типы не допускаются). |
[править] Типы-элементы
Тип | Определение |
value_type
|
T
|
[править] Фукции-элементы
создаёт необязательный объект (public функция-элемент) | |
уничтожает содержащееся значение, если оно есть (public функция-элемент) | |
присваивает содержимое (public функция-элемент) | |
Наблюдатели | |
получает доступ к содержащемуся значению (public функция-элемент) | |
проверяет, содержит ли объект значение (public функция-элемент) | |
возвращает содержащееся значение (public функция-элемент) | |
возвращает содержащееся значение, если доступно, иначе другое значение (public функция-элемент) | |
Монадические операции | |
(C++23) |
возвращает результат данной функции по содержащемуся значению, если оно существует, или пустой optional в противном случае (public функция-элемент) |
(C++23) |
возвращает optional , содержащий преобразованное содержащееся значение, если оно существует, или пустой optional в противном ��лучае (public функция-элемент) |
(C++23) |
возвращает сам optional , если он содержит значение, или результат данной функции иначе (public функция-элемент) |
Модификаторы | |
обменивает содержимое (public функция-элемент) | |
уничтожает любое содержащееся значение (public функция-элемент) | |
создаёт содержащееся значение на месте (public функция-элемент) |
[править] Функции, не являющиеся элементами
(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) |
индикатор типа optional с неинициализированным состоянием (класс) |
(C++17) |
исключение, указывающее на доступ на проверку к optional, не содержащему значения (класс) |
[править] Вспомогательные элементы
(C++17) |
объект типа nullopt_t (константа) |
тэг конструирования на месте (шаблон класса) |
[править] Руководства по выводу
[править] Примечание
Макрос тест функциональности | Значение | Стандарт | Комментарий |
---|---|---|---|
__cpp_lib_optional |
201606L | (C++17) | std::optional
|
__cpp_lib_optional |
202106L | (C++20) | Полностью constexpr |
__cpp_lib_optional |
202110L | (C++23) | Монадические операции |
[править] Пример
#include <iostream> #include <optional> #include <string> // optional может использоваться как возвращаемый тип фабрики, которая может дать сбой std::optional<std::string> create(bool b) { if (b) return "Годзилла"; return {}; } // std::nullopt можно использовать для создания любого (пустого) std::optional auto create2(bool b) { return b ? std::optional<std::string>{"Годзилла"} : std::nullopt; } int main() { std::cout << "create(false) вернула " << create(false).value_or("пусто") << '\n'; // фабричные функции с необязательным возвратом можно использовать как условия // while и if if (auto str = create2(true)) { std::cout << "create2(true) вернула " << *str << '\n'; } }
Вывод:
create(false) вернула пусто create2(true) вернула Годзилла
[править] Смотрите также
(C++17) |
типобезопасное размеченное объединение (шаблон класса) |
(C++17) |
объекты, содержащие экземпляры любого CopyConstructible типа. (класс) |