Daily bit(e) C++. std::expected
Добавлено 20 сентября 2023 в 06:41
Daily bit(e) C++ #221, тип результата в C++23, который может представлять либо результат, либо ошибку.
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.