Daily bit(e) C++. Доступ к содержимому std::optional

Добавлено 21 сентября 2026 в 04:56

Daily bit(e) C++ 110, доступ к содержимому std::optional в C++17.

Daily bit(e) C++

Класс 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

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование