Spec-Zone.ru › C++

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().

Объект optional является view, который содержит либо один элемент, если он содержит значение, либо ноль элементов, если не содержит значения. Время жизни содержащегося элемента ограничено временем жизни объекта.

(начиная с 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
(открытая функция-член)
(деструктор)
уничтожает хранимое значение, если оно есть
(открытая функция-член)
operator=
присваивает содержимое
(открытая функция-член)
Итераторы
begin
(C++26)
возвращает итератор на начало
(открытая функция-член)
end
(C++26)
возвращает итератор на конец
(открытая функция-член)
Функции наблюдения
operator->operator*
обращается к хранимому значению
(открытая функция-член)
operator boolhas_value
проверяет, содержит ли объект значение
(открытая функция-член)
value
возвращает хранимое значение
(открытая функция-член)
value_or
возвращает хранимое значение, если оно доступно, иное значение в противном случае
(открытая функция-член)
Монадические операции
and_then
(C++23)
возвращает результат применения заданной функции к хранимому значению, если оно существует, или пустой optional в противном случае
(открытая функция-член)
transform
(C++23)
возвращает optional, содержащий преобразованное хранимое значение, если оно существует, или пустой optional в противном случае
(открытая функция-член)
or_else
(C++23)
возвращает сам optional, если он содержит значение, или результат заданной функции в противном случае
(открытая функция-член)
Модификаторы
swap
обменивает содержимое
(открытая функция-член)
reset
уничтожает любое хранимое значение
(открытая функция-член)
emplace
создаёт хранимое значение на месте
(открытая функция-член)

Функции, не являющиеся членами

operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20)
сравнивает объекты optional
(шаблон функции)
make_optional
(C++17)
создаёт объект optional
(шаблон функции)
std::swap(std::optional)
(C++17)
специализирует алгоритм std::swap
(шаблон функции)

Вспомогательные классы

std::hash<std::optional>
(C++17)
поддержка хеширования для std::optional
(специализация шаблона класса)
nullopt_t
(C++17)
индикатор std::optional, не содержащего значения
(класс)
bad_optional_access
(C++17)
исключение, указывающее на проверяемый доступ к optional, не содержащему значения
(класс)

Вспомогательные элементы

nullopt
(C++17)
объект типа nullopt_t
(константа)
in_placein_place_typein_place_indexin_place_tin_place_type_tin_place_index_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

См. также

variant
(C++17)
типобезопасное размеченное объединение
(шаблон класса)
any
(C++17)
объекты, хранящие экземпляры любого типа, соответствующего требованиям CopyConstructible
(класс)
expected
(C++23)
обёртка, содержащая ожидаемое значение или значение ошибки
(шаблон класса)
ranges::single_viewviews::single
(C++20)
view, содержащий единственный элемент с заданным значением
(шаблон класса) (объект точки настройки)
ranges::empty_viewviews::empty
(C++20)
пустой view без элементов
(шаблон класса) (шаблон переменной)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/optional

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API