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, который содержит значение.
Объект не содержит значения в следующих условиях:
- Объект инициализирован по умолчанию.
- Объект инициализирован/присвоен значением типа
std::nullopt_tили объектомoptional, который не содержит значения. - Вызывается член-функция
reset().
Не существует ссылок optional; программа некорректна, если она инициализирует optional с типом ссылки. Кроме того, программа некорректна, если она инициализирует optional с (возможно, квалифицированными cv) типами тэгов std::nullopt_t или std::in_place_t.
Параметры шаблона
| T | - | тип значения для управления состоянием инициализации. Тип должен удовлетворять требованиям Destructible (в частности, массивы и типы ссылок запрещены). |
Типы членов
| Тип члена | Определение |
|---|---|
value_type | T |
Член-функции
| создаёт объект optional (публичная член-функция) |
|
| уничтожает содержащееся значение, если оно есть (публичная член-функция) |
|
| присваивает содержимое (публичная член-функция) |
|
Наблюдатели |
|
| получает доступ к содержащемуся значению (публичная член-функция) |
|
| проверяет, содержит ли объект значение (публичная член-функция) |
|
| возвращает содержащееся значение (публичная член-функция) |
|
| возвращает содержащееся значение, если оно доступно, или другое значение иначе (публичная член-функция) |
|
Монадные операции |
|
|
(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) | индикатор типа optional с неинициализированным состоянием (класс) |
|
(C++17) | исключение, указывающее проверенный доступ к optional, который не содержит значение (класс) |
Помощники
|
(C++17) | объект типа nullopt_t (константа) |
|
(C++17) | тег для создания объекта на месте (тег) |
Руководства по выводу типов
Примечания
| Макрокоманда проверки наличия функции | Значение | Std | Функция |
|---|---|---|---|
__cpp_lib_optional | 201606L | (C++17) |
std::optional |
__cpp_lib_optional | 202106L |
(C++20) (DR) | Полностью constexpr |
__cpp_lib_optional | 202110L | (C++23) | Моноидные операции |
Пример
#include <iostream>
#include <optional>
#include <string>
// optional can be used as the return type of a factory that may fail
std::optional<std::string> create(bool b)
{
if (b)
return "Godzilla";
return {};
}
// std::nullopt can be used to create any (empty) 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-returning factory functions are usable as conditions of while and if
if (auto str = create2(true))
std::cout << "create2(true) returned " << *str << '\n';
}Вывод:
create(false) returned empty create2(true) returned Godzilla
См. также
|
(C++17) | безопасно типы объединение (шаблон класса) |
|
(C++17) | объекты, которые хранят экземпляры любого CopyConstructible типа (класс) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/optional