Ежедневный бит (е) C++ # 101, представление необязательных значений с использованием std::unique_ptr и std::Optional

Если мы хотим представить необязательное значение, мы можем использовать std::unique_ptr (C++11) и выделение кучи (nullptr обозначает отсутствие). Однако это влечет за собой затраты времени выполнения и может привести к сбою (и броску).

std::Optional (C++17) не будет выделять динамическую память и несет только затраты на хранение логического значения.

#include <memory>
#include <optional>

struct Data{};

std::unique_ptr<Data> dynamic_return() {
    return std::make_unique<Data>();
}

std::optional<Data> no_allocation() {
    return std::make_optional<Data>();
}


auto x = dynamic_return();
if (x != nullptr) { // or simply if(x)
    // process data
}

auto y = no_allocation();
if (y.has_value()) { // or simply if(y)
    // process data
}

Откройте пример в Compiler Explorer.