Ежедневный бит (е) 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.