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 типа. (класс) |

