Daily bit(e) C++. Доступ к содержимому std::optional
Добавлено 21 сентября 2026 в 04:56
Daily bit(e) C++ 110, доступ к содержимому std::optional в C++17.

Класс std::optional (появившийся в C++17) предоставляет несколько способов доступа к хранящемуся в нем значению.
Выбор зависит от вашего стиля написания кода и желаемой семантики обработки исключений.
#include <optional>
struct Data
{
void method() {}
int v;
};
std::optional<Data> x{Data{1}};
// Интерфейс noexcept в стиле указателей
if (x != std::nullopt)
{
x->method();
auto y = *x;
// decltype(y) == Data
// y.v == 1
}
// Явный интерфейс с генерацией исключений
if (x.has_value())
{
auto y = x.value(); // если пуст, выкидывает исключениеbad_optional_access
// decltype(y) == Data
// y.v == 1
}
// Default-value interface, throws only if construction of the
// contained type throws
// Интерфейс со значением по умолчанию; выбрасывает исключение,
// только если исключение возникает при создании объекта
// содержащегося типа.
auto y = x.value_or(Data{2});
// y.v == 1
x = std::nullopt; // или x.reset();
auto z = x.value_or(Data{2});
// z.v == 2
