Namespaces
Variants

std:: optional

From cppreference.net
Utilities library
Определено в заголовке <optional>
template < class T >
class optional ;
(начиная с C++17)

Шаблон класса std::optional управляет опциональным содержащимся значением, то есть значением, которое может присутствовать или отсутствовать.

Распространённый случай использования optional — возвращаемое значение функции, которая может завершиться неудачей. В отличие от других подходов, таких как std:: pair < T, bool > , optional эффективно работает с объектами, дорогими для создания, и является более читаемым, поскольку явно выражает намерение.

Любой экземпляр optional в любой момент времени либо содержит значение , либо не содержит значения .

Если optional содержит значение, гарантируется, что значение размещено внутри объекта optional . Таким образом, объект optional моделирует объект, а не указатель, даже несмотря на то, что для него определены operator*() и operator->() .

Когда объект типа optional<T> подвергается контекстному преобразованию в bool , преобразование возвращает true , если объект содержит значение, и false , если он не содержит значения.

Объект optional содержит значение при следующих условиях:

  • Объект инициализируется значением типа T или присваивается из другого optional , который содержит значение.

Объект не содержит значения в следующих условиях:

  • Объект инициализируется по умолчанию.
  • Объект инициализируется значением типа std::nullopt_t или присваивается из optional объекта, который не содержит значения.
  • Вызывается функция-член reset() .

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

(since C++26)

Не существует опциональных ссылок, функций, массивов или (возможно, cv-квалифицированного) void ; программа является некорректной, если создаёт экземпляр optional с таким типом. Кроме того, программа является некорректной, если создаёт экземпляр optional с (возможно, cv-квалифицированными) теговыми типами std::nullopt_t или std::in_place_t .

Содержание

Параметры шаблона

T - тип значения, для которого управляется состоянием инициализации. Тип должен удовлетворять требованиям Destructible (в частности, массивы и ссылочные типы не допускаются).

Вложенные типы

Тип Определение
value_type T
iterator (since C++26) определяемый реализацией LegacyRandomAccessIterator , ConstexprIterator , и contiguous_iterator , у которого value_type и reference являются std:: remove_cv_t < T > и T & , соответственно.
const_iterator (since C++26) определяемый реализацией LegacyRandomAccessIterator , ConstexprIterator , и contiguous_iterator , у которого value_type и reference являются std:: remove_cv_t < T > и const T & , соответственно.

Все требования к типам итераторов для 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
(шаблон функции)
создает объект optional
(шаблон функции)
специализирует алгоритм std::swap
(шаблон функции)

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

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

Вспомогательные средства

(C++17)
объект типа nullopt_t
(константа)
тег для конструирования на месте
(тег)

Вспомогательные специализации

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 может использоваться как тип возвращаемого значения фабрики, которая может завершиться неудачей
std::optional<std::string> create(bool b)
{
    if (b)
        return "Godzilla";
    return {};
}
// std::nullopt может использоваться для создания любого (пустого) 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, могут использоваться как условия в while и if
    if (auto str = create2(true))
        std::cout << "create2(true) returned " << *str << '\n';
}

Вывод:

create(false) returned empty
create2(true) returned Godzilla

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 4141 C++17 требование к выделению памяти
было запутанным
содержащийся объект должен быть
вложен в объект optional

Смотрите также

(C++17)
типобезопасное размеченное объединение
(шаблон класса)
(C++17)
объекты, содержащие экземпляры любого CopyConstructible типа
(класс)
(C++23)
обёртка, содержащая либо ожидаемое, либо ошибочное значение
(шаблон класса)
view содержащий единственный элемент указанного значения
(шаблон класса) (объект точки настройки)
пустой view без элементов
(шаблон класса) (шаблон переменной)