102 constexpr expected()
noexcept;
106 template <
class G,
typename = std::enable_if_t<std::is_convertible_v<G, E>>>
109 template <
class G,
typename = std::enable_if_t<std::is_convertible_v<G, E>>>
112 bool has_value()
const noexcept;
113 explicit operator
bool()
const noexcept;
117 const E& error()
const;
120 std::variant<std::monostate,
unexpected<E>> data_;
130 : value_{std::forward<E>(error)}
134template <
class... Args>
136 : value_(std::forward<Args>(args)...)
140template <
class U,
class... Args>
141unexpected<E>::unexpected(std::initializer_list<U> il, Args&&... args)
142 : value_(il, std::forward<Args>(args)...)
151const E&
unexpected<E>::error()
const noexcept {
155template <
class S,
class E>
157 : data_(std::in_place_index<0>)
160template <
class S,
class E>
161expected<S, E>::expected(
const S& success)
165template <
class S,
class E>
166expected<S, E>::expected(S&& success)
167 : data_(std::forward<S>(success))
170template <
class S,
class E>
172 : data_(error.error())
175template <
class S,
class E>
177 : data_(std::forward<
unexpected<E>>(error.error()))
180template <
class S,
class E>
181template <
class G,
typename>
183 : data_(utils::
unexpected<E>(std::forward<G>(error.error())))
186template <
class S,
class E>
187template <
class G,
typename>
189 : data_(utils::
unexpected<E>(std::forward<G>(error.error())))
192template <
class S,
class E>
194 return std::holds_alternative<S>(data_);
197template <
class S,
class E>
202template <
class S,
class E>
204 S* result = std::get_if<S>(&data_);
205 if (result ==
nullptr) {
211template <
class S,
class E>
213 return std::move(value());
216template <
class S,
class E>
218 const S* result = std::get_if<S>(&data_);
219 if (result ==
nullptr) {
225template <
class S,
class E>
227 auto* result = std::get_if<
unexpected<E>>(&data_);
228 if (result ==
nullptr) {
231 return result->error();
234template <
class S,
class E>
236 const auto* result = std::get_if<
unexpected<E>>(&data_);
237 if (result ==
nullptr) {
240 return result->error();