X Tutup
The Wayback Machine - https://web.archive.org/web/20211006175423/https://ru.cppreference.com/w/cpp/utility/optional
Пространства имён
Варианты
Действия

std::optional

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

(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
optional
(C++17)
(C++17)
(C++17)

Элементарные преобразования строк
(C++17)
(C++17)

Stacktrace
 
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 из std::reference_wrapper типа T. Кроме того, программа некорректна, если она создаёт экземпляр optional с (возможно, cv-квалифицированными) типами тегов std::nullopt_t или std::in_place_t.

Содержание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#include <string>
#include <functional>
#include <iostream>
#include <optional>
 
// 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;
}
 
// std::reference_wrapper может использоваться для возврата ссылки
auto create_ref(bool b) {
    static std::string value = "Годзилла";
    return b ? std::optional<std::reference_wrapper<std::string>>{value}
             : 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';
    }
 
    if (auto str = create_ref(true)) {
        // использование get() для доступа к значению reference_wrapper
        std::cout << "create_ref(true) вернула " << str->get() << '\n';
        str->get() = "Mothra";
        std::cout << "модификация изменила её на " << str->get() << '\n';
    }
}

Вывод:

create(false) вернула пусто
create2(true) вернула Годзилла
create_ref(true) вернула Годзилла
модификация изменила её на Mothra

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

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