Пространства имён
Варианты
Действия

std::optional

Материал из cppreference.com
< cpp‎ | utility
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
optional
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
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, который содержит значение.

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

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

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

Содержание

[править] Параметры шаблона

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

[править] Типы-элементы

Тип Определение
value_type T

[править] Фукции-элементы

создаёт необязательный объект
(public функция-элемент) [править]
уничтожает содержащееся значение, если оно есть
(public функция-элемент) [править]
присваивает содержимое
(public функция-элемент) [править]
Наблюдатели
получает доступ к содержащемуся значению
(public функция-элемент) [править]
проверяет, содержит ли объект значение
(public функция-элемент) [править]
возвращает содержащееся значение
(public функция-элемент) [править]
возвращает содержащееся значение, если доступно, иначе другое значение
(public функция-элемент) [править]
Монадические операции
(C++23)
возвращает результат данной функции по содержащемуся значению, если оно существует, или пустой optional в противном случае
(public функция-элемент) [править]
(C++23)
возвращает optional, содержащий преобразованное содержащееся значение, если оно существует, или пустой optional в противном ��лучае
(public функция-элемент) [править]
(C++23)
возвращает сам optional, если он содержит значение, или результат данной функции иначе
(public функция-элемент) [править]
Модификаторы
обменивает содержимое
(public функция-элемент) [править]
уничтожает любое содержащееся значение
(public функция-элемент) [править]
создаёт содержащееся значение на месте
(public функция-элемент) [править]

[править] Функции, не являющиеся элементами

(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20)
сравнивает объекты optional
(шаблон функции) [править]
создаёт объект optional
(шаблон функции) [править]
специализация алгоритма std::swap
(шаблон функции) [править]

[править] Вспомогательные классы

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

[править] Вспомогательные элементы

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

[править] Руководства по выводу

[править] Примечание

Макрос тест функциональности Значение Стандарт Комментарий
__cpp_lib_optional 201606L (C++17) std::optional
__cpp_lib_optional 202106L (C++20) Полностью constexpr
__cpp_lib_optional 202110L (C++23) Монадические операции

[править] Пример

#include <iostream>
#include <optional>
#include <string>
 
// optional может использоваться как возвращаемый тип фабрики, которая может дать сбой
std::optional<std::string> create(bool b) {
    if (b)
        return "Годзилла";
    return {};
}
 
// std::nullopt можно использовать для создания любого (пустого) std::optional
auto create2(bool b) {
    return b ? std::optional<std::string>{"Годзилла"} : std::nullopt;
}
 
int main()
{
    std::cout << "create(false) вернула "
              << create(false).value_or("пусто") << '\n';
 
    // фабричные функции с необязательным возвратом можно использовать как условия
    // while и if
    if (auto str = create2(true)) {
        std::cout << "create2(true) вернула " << *str << '\n';
    }
}

Вывод:

create(false) вернула пусто
create2(true) вернула Годзилла

[править] Смотрите также

(C++17)
типобезопасное размеченное объединение
(шаблон класса) [править]
(C++17)
объекты, содержащие экземпляры любого CopyConstructible типа.
(класс) [править]