12 template <
typename T,
typename E>
13 requires (!std::is_same_v<T, E>)
17 static constexpr auto is_constructible_v =
18 std::is_constructible_v<T, X> || std::is_constructible_v<E, X>;
25 Expected(
const Expected&) =
default;
26 Expected(Expected&&)
noexcept =
default;
27 ~Expected() =
default;
30 requires is_constructible_v<X>
32 : data(std::forward<X>(x))
35 Expected& operator=(
const Expected&) =
default;
36 Expected& operator=(Expected&&)
noexcept =
default;
39 requires is_constructible_v<X>
40 Expected& operator=(X&& x)
42 data = std::forward<X>(x);
46 bool has_value()
const {
return std::holds_alternative<T>(data); }
47 explicit operator
bool()
const {
return has_value(); }
49 const value_type& value()
const& {
return std::get<T>(data); }
50 value_type& value() & {
return std::get<T>(data); }
51 value_type value() && {
return std::get<T>(std::move(data)); }
53 const value_type& operator*()
const& {
return value(); }
54 value_type& operator*() & {
return value(); }
56 const value_type* operator->()
const& {
return std::get_if<T>(&data); }
57 value_type* operator->() & {
return std::get_if<T>(&data); }
60 const T& value_or(
const U& fallback)
const&
67 T&& value_or(U&& fallback) &&
70 return std::move(value());
71 return std::forward<U>(fallback);
74 T&& move_value_or(T&& fallback)
77 return std::move(value());
78 return std::move(fallback);
81 const E& error()
const& {
return std::get<E>(data); }
82 E& error() & {
return std::get<E>(data); }
85 std::variant<T, E> data;