Daily bit(e) C++. std::expected

Добавлено 20 сентября 2023 в 06:41

Daily bit(e) C++ #221, тип результата в C++23, который может представлять либо результат, либо ошибку.

Daily bit(e) C++

std::expected – это тип в C++23, представляющий либо корректный результат, либо непредвиденную ошибку.

Семантически std::expected работает очень похоже на std::optional; вместо того, чтобы опционально сохранять значение, std::expected всегда хранит либо результат, либо ошибку.

#include <expected>
#include <string>
#include <system_error>

// Типовой случай использования
std::expected<std::string,std::error_code> fun() 
{
    if (/* какая-то операция, которая может дать сбой */)
    {
        return std::unexpected(std::make_error_code(
            std::errc::invalid_argument));
    }
    return "Hello World!";
}

// Интерфейс, подобный std::optional
std::expected<int,int> v = 10;
// v.has_value() == true
// v.value() == 10, *v == 10


// Чтобы отличить ошибку, ее необходимо обернуть в std::unexpected.
std::expected<int,int> e = std::unexpected{10};
// e.has_value() == false
// e.error() == 10


// std::expected всегда содержит либо результат, либо ошибку
std::expected<int,int> m;
// m.has_value() == true
// m.value() == int{} == 0


// Поэтому, если тип результата не может быть сконструирован
// по умолчанию, результирующий std::expected также не может
// быть сконструирован по умолчанию.
struct NoDefault 
{
    NoDefault(int) {}
};
// std::expected<NoDefault,int> n;  // Не скомпилируется
std::expected<NoDefault,int> n{20}; // OK
// n.has_value() == true

Открыть пример на Compiler Explorer.

Теги

C++ / CppC++23Daily bit(e) C++std::expectedSTL / Standard Template Library / Стандартная библиотека шаблоновПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.