std::optional
Объявлено в заголовочном файле <optional> | ||
|---|---|---|
template< class T > class optional; | (начиная с C++17) |
Шаблон класса std::optional управляет необязательным хранимым значением, то есть значением, которое может присутствовать или отсутствовать.
Частый вариант использования optional — возвращаемое значение функции, выполнение которой может завершиться неудачей. В отличие от других подходов, таких как std::pair<T,bool>, optional хорошо работает с объектами, создание которых требует значительных затрат, и делает код более понятным, поскольку намерение выражено явно.
В любой момент времени экземпляр optional либо содержит значение, либо не содержит значения.
Если optional содержит значение, гарантируется, что оно вложено в объект optional. Таким образом, объект optional моделирует объект, а не указатель, несмотря на то, что определены operator*() и operator->().
При контекстном преобразовании в bool объекта типа optional<T> результатом преобразования будет true, если объект содержит значение, и false, если не содержит.
Объект optional содержит значение в следующих случаях:
- Объект инициализирован значением типа
Tили другимoptional, содержащим значение, либо ему присвоено такое значение.
Объект не содержит значения в следующих случаях:
- Объект инициализирован по умолчанию.
- Объект инициализирован значением типа
std::nullopt_tили объектомoptional, не содержащим значения, либо ему присвоено такое значение. - Вызвана функция-член
reset().
| Объект | (начиная с C++26) |
Не существует необязательных ссылок, функций, массивов или (возможно, cv-квалифицированного) типа void; программа некорректна, если в ней инстанцируется optional с таким типом. Кроме того, программа некорректна, если в ней инстанцируется optional с типами-тегами std::nullopt_t или std::in_place_t (возможно, cv-квалифицированными).
Параметры шаблона
| T | - | тип значения, для которого управляется состояние инициализации. Тип должен соответствовать требованиям Destructible (в частности, типы массивов и ссылок не допускаются). |
Вложенные типы
| Тип | Определение |
|---|---|
value_type |
T |
iterator (начиная с C++26) | определяемый реализацией LegacyRandomAccessIterator, ConstexprIterator и contiguous_iterator, у которых value_type и reference — соответственно std::remove_cv_t<T> и T&. |
const_iterator (начиная с C++26) | определяемый реализацией LegacyRandomAccessIterator, ConstexprIterator и contiguous_iterator, у которых value_type и reference — соответственно std::remove_cv_t<T> и constT&. |
Все требования к типам итераторов Container также применяются к типу iterator класса optional.
Поля данных
T* val | указатель на содержащийся объект (если он существует) (член-объект, используемый только для описания) |
Функции-члены
создаёт объект optional (открытая функция-член) |
|
| уничтожает хранимое значение, если оно есть (открытая функция-член) |
|
| присваивает содержимое (открытая функция-член) |
|
Итераторы |
|
|
(C++26) | возвращает итератор на начало (открытая функция-член) |
|
(C++26) | возвращает итератор на конец (открытая функция-член) |
Функции наблюдения |
|
| обращается к хранимому значению (открытая функция-член) |
|
| проверяет, содержит ли объект значение (открытая функция-член) |
|
| возвращает хранимое значение (открытая функция-член) |
|
| возвращает хранимое значение, если оно доступно, иное значение в противном случае (открытая функция-член) |
|
Монадические операции |
|
|
(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) | индикатор std::optional, не содержащего значения (класс) |
|
(C++17) | исключение, указывающее на проверяемый доступ к optional, не содержащему значения (класс) |
Вспомогательные элементы
|
(C++17) | объект типа nullopt_t (константа) |
|
(C++17) | тег конструирования на месте (тег) |
Вспомогательные специализации
template< class T > constexpr bool ranges::enable_view<std::optional<T>> = true; | (начиная с C++26) |
Эта специализация ranges::enable_view позволяет optional удовлетворять требованиям view.
template< class T > constexpr auto format_kind<std::optional<T>> = range_format::disabled; | (начиная с C++26) |
Эта специализация format_kind отключает поддержку форматирования диапазонов для optional.
Руководства по выводу типов
Примечания
| Макрос проверки поддержки | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_optional | 201606L | (C++17) |
std::optional |
202106L |
(C++23) (DR20) | Полная поддержка constexpr | |
202110L | (C++23) | Монадические операции | |
__cpp_lib_optional_range_support | 202406L | (C++26) | Поддержка диапазонов для std::optional |
Пример
#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++.
| DR | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 4141 | C++17 | требование к выделению памяти было неоднозначным | хранимый объект должен быть вложен в объект optional |
См. также
|
(C++17) | типобезопасное размеченное объединение (шаблон класса) |
|
(C++17) | объекты, хранящие экземпляры любого типа, соответствующего требованиям CopyConstructible (класс) |
|
(C++23) | обёртка, содержащая ожидаемое значение или значение ошибки (шаблон класса) |
|
(C++20) | view, содержащий единственный элемент с заданным значением(шаблон класса) (объект точки настройки) |
|
(C++20) | пустой view без элементов(шаблон класса) (шаблон переменной) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/optional