29 using unexpected_type = std::unexpected<E>;
34 constexpr expected(
const U &v) : v_(v) { }
36 constexpr expected(U &&v) : v_(std::move(v)) { }
41 template <
class ... Args>
42 constexpr explicit expected(
unexpect_t,Args &&...args) : v_(std::in_place_t<E>,args...) { }
44 constexpr const T *operator->()
const {
return &std::get<0>(v_); }
45 constexpr T *operator->() {
return &std::get<0>(v_); }
46 constexpr const T &operator*()
const {
return std::get<0>(v_); }
47 constexpr T &operator*() {
return std::get<0>(v_); }
48 constexpr bool has_value()
const {
return v_.index()==0; }
49 constexpr operator bool()
const {
return has_value(); }
50 constexpr const T &value()
const {
return std::get<0>(v_); }
51 constexpr T && value() {
return std::get<0>(v_); }
52 constexpr const E &error()
const {
return std::get<1>(v_); }
53 constexpr E && error() {
return std::get<1>(v_); }
54 constexpr T value_or(T &&default_value)
const {
return has_value() ? value() : default_value; }
57 constexpr auto and_then(F &&f) {
if (has_value())
return std::invoke(std::forward<F>(f),**
this);
else return *
this; }
60 constexpr auto or_else(F &&f) {
if (has_value())
return *
this;
else return std::invoke(std::forward<F>(f),error()); }