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