Namespaces
Variants

std::optional

Начиная с ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы проверки возможностей библиотеки (C++20)
Утилиты программ
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
 
 
Определён в заголовочном файле <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), которое содержит один элемент, если он содержит значение, или ноль элементов в противном случае. Время жизни содержащегося элемента привязано к объекту.

(начиная с C++26)

Не существует опциональных ссылок, функций, массивов или (возможно, cv-квалифицированных) void; программа является некорректной (ill-formed), если она инстанцирует 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 без элементов
(шаблон класса) (шаблон переменной)