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 из std::reference_wrapper типа T. Кроме того, программа некорректна, если она создаёт экземпляр optional с (возможно, cv-квалифицированными) типами тегов std::nullopt_t или std::in_place_t.
Содержание |
[править] Параметры шаблона
| T | — | тип значения, для которого нужно управлять состоянием инициализации. Тип должен быть Destructible (в частности, типы массивов не допускаются). |
[править] Типы-элементы
| Тип | Определине |
value_type
|
T
|
[править] Фукции-элементы
| создаёт необязательный объект (public функция-элемент) | |
| уничтожает содержащееся значение, если оно есть (public функция-элемент) | |
| присваивает содержимое (public функция-элемент) | |
Наблюдатели | |
| получает доступ к содержащемуся значению (public функция-элемент) | |
| проверяет, содержит ли объект значение (public функция-элемент) | |
| возвращает содержащееся значение (public функция-элемент) | |
| возвращает содержащееся значение, если доступно, иначе другое значение (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::hash (специализация шаблона класса) |
| (C++17) |
индикатор типа optional с неинициализированным состоянием (класс) |
| (C++17) |
исключение, указывающее на доступ на проверку к optional, не содержащему значения (класс) |
[править] Вспомогательные элементы
| (C++17) |
объект типа nullopt_t (константа) |
| метка конструирования на месте (шаблон класса) | |
[править] Руководства по выводу
[править] Пример
#include <string> #include <functional> #include <iostream> #include <optional> // 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; } // std::reference_wrapper может использоваться для возврата ссылки auto create_ref(bool b) { static std::string value = "Годзилла"; return b ? std::optional<std::reference_wrapper<std::string>>{value} : 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'; } if (auto str = create_ref(true)) { // использование get() для доступа к значению reference_wrapper std::cout << "create_ref(true) вернула " << str->get() << '\n'; str->get() = "Mothra"; std::cout << "модификация изменила её на " << str->get() << '\n'; } }
Вывод:
create(false) вернула пусто create2(true) вернула Годзилла create_ref(true) вернула Годзилла модификация изменила её на Mothra
[править] Смотрите также
| (C++17) |
типобезопасное размеченное объединение (шаблон класса) |
| (C++17) |
объекты, содержащие экземпляры любого CopyConstructible типа. (класс) |

