Spec-Zone.ru › C++

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, который содержит значение.

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

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

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

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

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

Типы членов

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

Член-функции

(конструктор)
создаёт объект optional
(публичная член-функция)
(деструктор)
уничтожает содержащееся значение, если оно есть
(публичная член-функция)
operator=
присваивает содержимое
(публичная член-функция)
Наблюдатели
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)
индикатор типа 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)
тег для создания объекта на месте
(тег)

Руководства по выводу типов

Примечания

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

Пример

#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

См. также

variant
(C++17)
безопасно типы объединение
(шаблон класса)
any
(C++17)
объекты, которые хранят экземпляры любого CopyConstructible типа
(класс)

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

Spec-Zone.ru

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