1908 lines · c
1// -*- C++ -*-2//===----------------------------------------------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9#ifndef _LIBCPP___EXPECTED_EXPECTED_H10#define _LIBCPP___EXPECTED_EXPECTED_H11 12#include <__assert>13#include <__config>14#include <__expected/bad_expected_access.h>15#include <__expected/unexpect.h>16#include <__expected/unexpected.h>17#include <__functional/invoke.h>18#include <__memory/addressof.h>19#include <__memory/construct_at.h>20#include <__type_traits/conditional.h>21#include <__type_traits/conjunction.h>22#include <__type_traits/disjunction.h>23#include <__type_traits/integral_constant.h>24#include <__type_traits/invoke.h>25#include <__type_traits/is_assignable.h>26#include <__type_traits/is_constructible.h>27#include <__type_traits/is_convertible.h>28#include <__type_traits/is_core_convertible.h>29#include <__type_traits/is_function.h>30#include <__type_traits/is_nothrow_assignable.h>31#include <__type_traits/is_nothrow_constructible.h>32#include <__type_traits/is_reference.h>33#include <__type_traits/is_same.h>34#include <__type_traits/is_swappable.h>35#include <__type_traits/is_trivially_constructible.h>36#include <__type_traits/is_trivially_destructible.h>37#include <__type_traits/is_trivially_relocatable.h>38#include <__type_traits/is_void.h>39#include <__type_traits/lazy.h>40#include <__type_traits/negation.h>41#include <__type_traits/remove_cv.h>42#include <__type_traits/remove_cvref.h>43#include <__utility/as_const.h>44#include <__utility/exception_guard.h>45#include <__utility/forward.h>46#include <__utility/in_place.h>47#include <__utility/move.h>48#include <__utility/swap.h>49#include <__verbose_abort>50#include <initializer_list>51 52#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)53# pragma GCC system_header54#endif55 56_LIBCPP_PUSH_MACROS57#include <__undef_macros>58 59#if _LIBCPP_STD_VER >= 2360 61_LIBCPP_BEGIN_NAMESPACE_STD62 63template <class _Tp, class _Err>64class expected;65 66template <class _Tp>67struct __is_std_expected : false_type {};68 69template <class _Tp, class _Err>70struct __is_std_expected<expected<_Tp, _Err>> : true_type {};71 72struct __expected_construct_in_place_from_invoke_tag {};73struct __expected_construct_unexpected_from_invoke_tag {};74 75template <class _Err, class _Arg>76_LIBCPP_HIDE_FROM_ABI void __throw_bad_expected_access(_Arg&& __arg) {77# if _LIBCPP_HAS_EXCEPTIONS78 throw bad_expected_access<_Err>(std::forward<_Arg>(__arg));79# else80 (void)__arg;81 _LIBCPP_VERBOSE_ABORT("bad_expected_access was thrown in -fno-exceptions mode");82# endif83}84 85// If parameter type `_Tp` of `__conditional_no_unique_address` is neither86// copyable nor movable, a constructor with this tag is provided. For that87// constructor, the user has to provide a function and arguments. The function88// must return an object of type `_Tp`. When the function is invoked by the89// constructor, guaranteed copy elision kicks in and the `_Tp` is constructed90// in place.91struct __conditional_no_unique_address_invoke_tag {};92 93// This class implements an object with `[[no_unique_address]]` conditionally applied to it,94// based on the value of `_NoUnique`.95//96// A member of this class must always have `[[no_unique_address]]` applied to97// it. Otherwise, the `[[no_unique_address]]` in the "`_NoUnique == true`" case98// would not have any effect. In the `false` case, the `__v` is not99// `[[no_unique_address]]`, so nullifies the effects of the "outer"100// `[[no_unique_address]]` regarding data layout.101//102// If we had a language feature, this class would basically be replaced by `[[no_unique_address(condition)]]`.103template <bool _NoUnique, class _Tp>104struct __conditional_no_unique_address;105 106template <class _Tp>107struct __conditional_no_unique_address<true, _Tp> {108 template <class... _Args>109 _LIBCPP_HIDE_FROM_ABI constexpr explicit __conditional_no_unique_address(in_place_t, _Args&&... __args)110 : __v(std::forward<_Args>(__args)...) {}111 112 template <class _Func, class... _Args>113 _LIBCPP_HIDE_FROM_ABI constexpr explicit __conditional_no_unique_address(114 __conditional_no_unique_address_invoke_tag, _Func&& __f, _Args&&... __args)115 : __v(std::invoke(std::forward<_Func>(__f), std::forward<_Args>(__args)...)) {}116 117 _LIBCPP_NO_UNIQUE_ADDRESS _Tp __v;118};119 120template <class _Tp>121struct __conditional_no_unique_address<false, _Tp> {122 template <class... _Args>123 _LIBCPP_HIDE_FROM_ABI constexpr explicit __conditional_no_unique_address(in_place_t, _Args&&... __args)124 : __v(std::forward<_Args>(__args)...) {}125 126 template <class _Func, class... _Args>127 _LIBCPP_HIDE_FROM_ABI constexpr explicit __conditional_no_unique_address(128 __conditional_no_unique_address_invoke_tag, _Func&& __f, _Args&&... __args)129 : __v(std::invoke(std::forward<_Func>(__f), std::forward<_Args>(__args)...)) {}130 131 _Tp __v;132};133 134// This function returns whether the type `_Second` can be stuffed into the tail padding135// of the `_First` type if both of them are given `[[no_unique_address]]`.136template <class _First, class _Second>137inline constexpr bool __fits_in_tail_padding = []() {138 struct __x {139 _LIBCPP_NO_UNIQUE_ADDRESS _First __first;140 _LIBCPP_NO_UNIQUE_ADDRESS _Second __second;141 };142 return sizeof(__x) == sizeof(_First);143}();144 145// This class implements the storage used by `std::expected`. We have a few146// goals for this storage:147// 1. Whenever the underlying {_Tp | _Unex} combination has free bytes in its148// tail padding, we should reuse it to store the bool discriminator of the149// expected, so as to save space.150// 2. Whenever the `expected<_Tp, _Unex>` as a whole has free bytes in its tail151// padding, we should allow an object following the expected to be stored in152// its tail padding.153// 3. However, we never want a user object (say `X`) that would follow an154// `expected<_Tp, _Unex>` to be stored in the padding bytes of the155// underlying {_Tp | _Unex} union, if any. That is because we use156// `construct_at` on that union, which would end up overwriting the `X`157// member if it is stored in the tail padding of the union.158//159// To achieve this, `__expected_base`'s logic is implemented in an inner160// `__repr` class. `__expected_base` holds one `__repr` member which is161// conditionally `[[no_unique_address]]`. The `__repr` class holds the162// underlying {_Tp | _Unex} union and a boolean "has value" flag.163//164// Which one of the `__repr_`/`__union_` members is `[[no_unique_address]]`165// depends on whether the "has value" boolean fits into the tail padding of166// the underlying {_Tp | _Unex} union:167//168// - In case the "has value" bool fits into the tail padding of the union, the169// whole `__repr_` member is _not_ `[[no_unique_address]]` as it needs to be170// transparently replaced on `emplace()`/`swap()` etc.171// - In case the "has value" bool does not fit into the tail padding of the172// union, only the union member must be transparently replaced (therefore is173// _not_ `[[no_unique_address]]`) and the "has value" flag must be adjusted174// manually.175//176// This way, the member that is transparently replaced on mutating operations177// is never `[[no_unique_address]]`, satisfying the requirements from178// "[basic.life]" in the standard.179//180// Stripped away of all superfluous elements, the layout of `__expected_base`181// then looks like this:182//183// template <class Tp, class Err>184// class expected_base {185// union union_t {186// [[no_unique_address]] Tp val;187// [[no_unique_address]] Err unex;188// };189//190// static constexpr bool put_flag_in_tail = fits_in_tail_padding<union_t, bool>;191// static constexpr bool allow_reusing_expected_tail_padding = !put_flag_in_tail;192//193// struct repr {194// private:195// // If "has value" fits into the tail, this should be196// // `[[no_unique_address]]`, otherwise not.197// [[no_unique_address]] conditional_no_unique_address<198// put_flag_in_tail,199// union_t>::type union_;200// [[no_unique_address]] bool has_val_;201// };202//203// protected:204// // If "has value" fits into the tail, this must _not_ be205// // `[[no_unique_address]]` so that we fill out the206// // complete `expected` object.207// [[no_unique_address]] conditional_no_unique_address<208// allow_reusing_expected_tail_padding,209// repr>::type repr_;210// };211//212template <class _Tp, class _Err>213class __expected_base {214 // use named union because [[no_unique_address]] cannot be applied to an unnamed union,215 // also guaranteed elision into a potentially-overlapping subobject is unsettled (and216 // it's not clear that it's implementable, given that the function is allowed to clobber217 // the tail padding) - see https://github.com/itanium-cxx-abi/cxx-abi/issues/107.218 union __union_t {219 _LIBCPP_HIDE_FROM_ABI constexpr __union_t(const __union_t&) = delete;220 _LIBCPP_HIDE_FROM_ABI constexpr __union_t(const __union_t&)221 requires(is_copy_constructible_v<_Tp> && is_copy_constructible_v<_Err> &&222 is_trivially_copy_constructible_v<_Tp> && is_trivially_copy_constructible_v<_Err>)223 = default;224 _LIBCPP_HIDE_FROM_ABI constexpr __union_t(__union_t&&) = delete;225 _LIBCPP_HIDE_FROM_ABI constexpr __union_t(__union_t&&)226 requires(is_move_constructible_v<_Tp> && is_move_constructible_v<_Err> &&227 is_trivially_move_constructible_v<_Tp> && is_trivially_move_constructible_v<_Err>)228 = default;229 _LIBCPP_HIDE_FROM_ABI constexpr __union_t& operator=(const __union_t&) = delete;230 _LIBCPP_HIDE_FROM_ABI constexpr __union_t& operator=(__union_t&&) = delete;231 232 template <class... _Args>233 _LIBCPP_HIDE_FROM_ABI constexpr explicit __union_t(in_place_t, _Args&&... __args)234 : __val_(std::forward<_Args>(__args)...) {}235 236 template <class... _Args>237 _LIBCPP_HIDE_FROM_ABI constexpr explicit __union_t(unexpect_t, _Args&&... __args)238 : __unex_(std::forward<_Args>(__args)...) {}239 240 template <class _Func, class... _Args>241 _LIBCPP_HIDE_FROM_ABI constexpr explicit __union_t(242 std::__expected_construct_in_place_from_invoke_tag, _Func&& __f, _Args&&... __args)243 : __val_(std::invoke(std::forward<_Func>(__f), std::forward<_Args>(__args)...)) {}244 245 template <class _Func, class... _Args>246 _LIBCPP_HIDE_FROM_ABI constexpr explicit __union_t(247 std::__expected_construct_unexpected_from_invoke_tag, _Func&& __f, _Args&&... __args)248 : __unex_(std::invoke(std::forward<_Func>(__f), std::forward<_Args>(__args)...)) {}249 250 _LIBCPP_HIDE_FROM_ABI constexpr ~__union_t()251 requires(is_trivially_destructible_v<_Tp> && is_trivially_destructible_v<_Err>)252 = default;253 254 // __repr's destructor handles this255 _LIBCPP_HIDE_FROM_ABI constexpr ~__union_t() {}256 257 _LIBCPP_NO_UNIQUE_ADDRESS _Tp __val_;258 _LIBCPP_NO_UNIQUE_ADDRESS _Err __unex_;259 };260 261 static constexpr bool __put_flag_in_tail = __fits_in_tail_padding<__union_t, bool>;262 static constexpr bool __allow_reusing_expected_tail_padding = !__put_flag_in_tail;263 264 struct __repr {265 _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr() = delete;266 267 template <class... _Args>268 _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(in_place_t __tag, _Args&&... __args)269 : __union_(in_place, __tag, std::forward<_Args>(__args)...), __has_val_(true) {}270 271 template <class... _Args>272 _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(unexpect_t __tag, _Args&&... __args)273 : __union_(in_place, __tag, std::forward<_Args>(__args)...), __has_val_(false) {}274 275 template <class... _Args>276 _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(std::__expected_construct_in_place_from_invoke_tag __tag,277 _Args&&... __args)278 : __union_(in_place, __tag, std::forward<_Args>(__args)...), __has_val_(true) {}279 280 template <class... _Args>281 _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(std::__expected_construct_unexpected_from_invoke_tag __tag,282 _Args&&... __args)283 : __union_(in_place, __tag, std::forward<_Args>(__args)...), __has_val_(false) {}284 285 // The return value of `__make_union` must be constructed in place in the286 // `__v` member of `__union_`, relying on guaranteed copy elision. To do287 // this, the `__conditional_no_unique_address_invoke_tag` constructor is288 // called with a lambda that is immediately called inside289 // `__conditional_no_unique_address`'s constructor.290 template <class _OtherUnion>291 _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(bool __has_val, _OtherUnion&& __other)292 requires(__allow_reusing_expected_tail_padding)293 : __union_(__conditional_no_unique_address_invoke_tag{},294 [&] { return __make_union(__has_val, std::forward<_OtherUnion>(__other)); }),295 __has_val_(__has_val) {}296 297 _LIBCPP_HIDE_FROM_ABI constexpr __repr(const __repr&) = delete;298 _LIBCPP_HIDE_FROM_ABI constexpr __repr(const __repr&)299 requires(is_copy_constructible_v<_Tp> && is_copy_constructible_v<_Err> &&300 is_trivially_copy_constructible_v<_Tp> && is_trivially_copy_constructible_v<_Err>)301 = default;302 _LIBCPP_HIDE_FROM_ABI constexpr __repr(__repr&&) = delete;303 _LIBCPP_HIDE_FROM_ABI constexpr __repr(__repr&&)304 requires(is_move_constructible_v<_Tp> && is_move_constructible_v<_Err> &&305 is_trivially_move_constructible_v<_Tp> && is_trivially_move_constructible_v<_Err>)306 = default;307 308 _LIBCPP_HIDE_FROM_ABI constexpr __repr& operator=(const __repr&) = delete;309 _LIBCPP_HIDE_FROM_ABI constexpr __repr& operator=(__repr&&) = delete;310 311 _LIBCPP_HIDE_FROM_ABI constexpr ~__repr()312 requires(is_trivially_destructible_v<_Tp> && is_trivially_destructible_v<_Err>)313 = default;314 315 _LIBCPP_HIDE_FROM_ABI constexpr ~__repr()316 requires(!is_trivially_destructible_v<_Tp> || !is_trivially_destructible_v<_Err>)317 {318 __destroy_union_member();319 }320 321 _LIBCPP_HIDE_FROM_ABI constexpr void __destroy_union()322 requires(__allow_reusing_expected_tail_padding &&323 (is_trivially_destructible_v<_Tp> && is_trivially_destructible_v<_Err>))324 {325 // Note: Since the destructor of the union is trivial, this does nothing326 // except to end the lifetime of the union.327 std::destroy_at(&__union_.__v);328 }329 330 _LIBCPP_HIDE_FROM_ABI constexpr void __destroy_union()331 requires(__allow_reusing_expected_tail_padding &&332 (!is_trivially_destructible_v<_Tp> || !is_trivially_destructible_v<_Err>))333 {334 __destroy_union_member();335 std::destroy_at(&__union_.__v);336 }337 338 template <class... _Args>339 _LIBCPP_HIDE_FROM_ABI constexpr void __construct_union(in_place_t, _Args&&... __args)340 requires(__allow_reusing_expected_tail_padding)341 {342 std::construct_at(&__union_.__v, in_place, std::forward<_Args>(__args)...);343 __has_val_ = true;344 }345 346 template <class... _Args>347 _LIBCPP_HIDE_FROM_ABI constexpr void __construct_union(unexpect_t, _Args&&... __args)348 requires(__allow_reusing_expected_tail_padding)349 {350 std::construct_at(&__union_.__v, unexpect, std::forward<_Args>(__args)...);351 __has_val_ = false;352 }353 354 private:355 template <class, class>356 friend class __expected_base;357 358 _LIBCPP_HIDE_FROM_ABI constexpr void __destroy_union_member()359 requires(!is_trivially_destructible_v<_Tp> || !is_trivially_destructible_v<_Err>)360 {361 if (__has_val_) {362 std::destroy_at(std::addressof(__union_.__v.__val_));363 } else {364 std::destroy_at(std::addressof(__union_.__v.__unex_));365 }366 }367 368 template <class _OtherUnion>369 _LIBCPP_HIDE_FROM_ABI static constexpr __union_t __make_union(bool __has_val, _OtherUnion&& __other)370 requires(__allow_reusing_expected_tail_padding)371 {372 if (__has_val)373 return __union_t(in_place, std::forward<_OtherUnion>(__other).__val_);374 else375 return __union_t(unexpect, std::forward<_OtherUnion>(__other).__unex_);376 }377 378 _LIBCPP_NO_UNIQUE_ADDRESS __conditional_no_unique_address<__put_flag_in_tail, __union_t> __union_;379 _LIBCPP_NO_UNIQUE_ADDRESS bool __has_val_;380 };381 382 template <class _OtherUnion>383 _LIBCPP_HIDE_FROM_ABI static constexpr __repr __make_repr(bool __has_val, _OtherUnion&& __other)384 requires(__put_flag_in_tail)385 {386 if (__has_val)387 return __repr(in_place, std::forward<_OtherUnion>(__other).__val_);388 else389 return __repr(unexpect, std::forward<_OtherUnion>(__other).__unex_);390 }391 392protected:393 template <class... _Args>394 _LIBCPP_HIDE_FROM_ABI constexpr explicit __expected_base(_Args&&... __args)395 : __repr_(in_place, std::forward<_Args>(__args)...) {}396 397 // In case we copy/move construct from another `expected` we need to create398 // our `expected` so that it either has a value or not, depending on the "has399 // value" flag of the other `expected`. To do this without falling back on400 // `std::construct_at` we rely on guaranteed copy elision using two helper401 // functions `__make_repr` and `__make_union`. There have to be two since402 // there are two data layouts with different members being403 // `[[no_unique_address]]`. GCC (as of version 13) does not do guaranteed404 // copy elision when initializing `[[no_unique_address]]` members. The two405 // cases are:406 //407 // - `__make_repr`: This is used when the "has value" flag lives in the tail408 // of the union. In this case, the `__repr` member is _not_409 // `[[no_unique_address]]`.410 // - `__make_union`: When the "has value" flag does _not_ fit in the tail of411 // the union, the `__repr` member is `[[no_unique_address]]` and the union412 // is not.413 //414 // This constructor "catches" the first case and leaves the second case to415 // `__union_t`, its constructors and `__make_union`.416 template <class _OtherUnion>417 _LIBCPP_HIDE_FROM_ABI constexpr explicit __expected_base(bool __has_val, _OtherUnion&& __other)418 requires(__put_flag_in_tail)419 : __repr_(__conditional_no_unique_address_invoke_tag{},420 [&] { return __make_repr(__has_val, std::forward<_OtherUnion>(__other)); }) {}421 422 _LIBCPP_HIDE_FROM_ABI constexpr void __destroy() {423 if constexpr (__put_flag_in_tail)424 std::destroy_at(&__repr_.__v);425 else426 __repr_.__v.__destroy_union();427 }428 429 template <class _Tag, class... _Args>430 _LIBCPP_HIDE_FROM_ABI constexpr void __construct(_Tag __tag, _Args&&... __args) {431 if constexpr (__put_flag_in_tail)432 std::construct_at(&__repr_.__v, __tag, std::forward<_Args>(__args)...);433 else434 __repr_.__v.__construct_union(__tag, std::forward<_Args>(__args)...);435 }436 437 _LIBCPP_HIDE_FROM_ABI constexpr bool __has_val() const { return __repr_.__v.__has_val_; }438 _LIBCPP_HIDE_FROM_ABI constexpr __union_t& __union() { return __repr_.__v.__union_.__v; }439 _LIBCPP_HIDE_FROM_ABI constexpr const __union_t& __union() const { return __repr_.__v.__union_.__v; }440 _LIBCPP_HIDE_FROM_ABI constexpr _Tp& __val() { return __repr_.__v.__union_.__v.__val_; }441 _LIBCPP_HIDE_FROM_ABI constexpr const _Tp& __val() const { return __repr_.__v.__union_.__v.__val_; }442 _LIBCPP_HIDE_FROM_ABI constexpr _Err& __unex() { return __repr_.__v.__union_.__v.__unex_; }443 _LIBCPP_HIDE_FROM_ABI constexpr const _Err& __unex() const { return __repr_.__v.__union_.__v.__unex_; }444 445private:446 _LIBCPP_NO_UNIQUE_ADDRESS __conditional_no_unique_address<__allow_reusing_expected_tail_padding, __repr> __repr_;447};448 449template <class _Tp, class _Err>450class expected : private __expected_base<_Tp, _Err> {451 static_assert(!is_reference_v<_Tp> && !is_function_v<_Tp> && !is_same_v<remove_cv_t<_Tp>, in_place_t> &&452 !is_same_v<remove_cv_t<_Tp>, unexpect_t> && !__is_std_unexpected<remove_cv_t<_Tp>>::value &&453 __valid_std_unexpected<_Err>::value,454 "[expected.object.general] A program that instantiates the definition of template expected<T, E> for a "455 "reference type, a function type, or for possibly cv-qualified types in_place_t, unexpect_t, or a "456 "specialization of unexpected for the T parameter is ill-formed. A program that instantiates the "457 "definition of the template expected<T, E> with a type for the E parameter that is not a valid "458 "template argument for unexpected is ill-formed.");459 460 template <class _Up, class _OtherErr>461 friend class expected;462 463 using __base _LIBCPP_NODEBUG = __expected_base<_Tp, _Err>;464 465public:466 using value_type = _Tp;467 using error_type = _Err;468 using unexpected_type = unexpected<_Err>;469 470 using __trivially_relocatable _LIBCPP_NODEBUG =471 __conditional_t<__libcpp_is_trivially_relocatable<_Tp>::value && __libcpp_is_trivially_relocatable<_Err>::value,472 expected,473 void>;474 475 template <class _Up>476 using rebind = expected<_Up, error_type>;477 478 // [expected.object.ctor], constructors479 _LIBCPP_HIDE_FROM_ABI constexpr expected() noexcept(is_nothrow_default_constructible_v<_Tp>) // strengthened480 requires is_default_constructible_v<_Tp>481 : __base(in_place) {}482 483 _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected&) = delete;484 485 _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected&)486 requires(is_copy_constructible_v<_Tp> && is_copy_constructible_v<_Err> && is_trivially_copy_constructible_v<_Tp> &&487 is_trivially_copy_constructible_v<_Err>)488 = default;489 490 _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected& __other) noexcept(491 is_nothrow_copy_constructible_v<_Tp> && is_nothrow_copy_constructible_v<_Err>) // strengthened492 requires(is_copy_constructible_v<_Tp> && is_copy_constructible_v<_Err> &&493 !(is_trivially_copy_constructible_v<_Tp> && is_trivially_copy_constructible_v<_Err>))494 : __base(__other.__has_val(), __other.__union()) {}495 496 _LIBCPP_HIDE_FROM_ABI constexpr expected(expected&&)497 requires(is_move_constructible_v<_Tp> && is_move_constructible_v<_Err> && is_trivially_move_constructible_v<_Tp> &&498 is_trivially_move_constructible_v<_Err>)499 = default;500 501 _LIBCPP_HIDE_FROM_ABI constexpr expected(expected&& __other) noexcept(502 is_nothrow_move_constructible_v<_Tp> && is_nothrow_move_constructible_v<_Err>)503 requires(is_move_constructible_v<_Tp> && is_move_constructible_v<_Err> &&504 !(is_trivially_move_constructible_v<_Tp> && is_trivially_move_constructible_v<_Err>))505 : __base(__other.__has_val(), std::move(__other.__union())) {}506 507private:508 template <class _Up, class _OtherErr, class _UfQual, class _OtherErrQual>509 using __can_convert _LIBCPP_NODEBUG = _And<510 is_constructible<_Tp, _UfQual>,511 is_constructible<_Err, _OtherErrQual>,512 _If<_Not<is_same<remove_cv_t<_Tp>, bool>>::value,513 _And< _Not<_And<is_same<_Tp, _Up>, is_same<_Err, _OtherErr>>>, // use the copy constructor instead, see #92676514 _Not<is_constructible<_Tp, expected<_Up, _OtherErr>&>>,515 _Not<is_constructible<_Tp, expected<_Up, _OtherErr>>>,516 _Not<is_constructible<_Tp, const expected<_Up, _OtherErr>&>>,517 _Not<is_constructible<_Tp, const expected<_Up, _OtherErr>>>,518 _Not<is_convertible<expected<_Up, _OtherErr>&, _Tp>>,519 _Not<is_convertible<expected<_Up, _OtherErr>&&, _Tp>>,520 _Not<is_convertible<const expected<_Up, _OtherErr>&, _Tp>>,521 _Not<is_convertible<const expected<_Up, _OtherErr>&&, _Tp>>>,522 true_type>,523 _Not<is_constructible<unexpected<_Err>, expected<_Up, _OtherErr>&>>,524 _Not<is_constructible<unexpected<_Err>, expected<_Up, _OtherErr>>>,525 _Not<is_constructible<unexpected<_Err>, const expected<_Up, _OtherErr>&>>,526 _Not<is_constructible<unexpected<_Err>, const expected<_Up, _OtherErr>>> >;527 528 template <class _Func, class... _Args>529 _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(530 std::__expected_construct_in_place_from_invoke_tag __tag, _Func&& __f, _Args&&... __args)531 : __base(__tag, std::forward<_Func>(__f), std::forward<_Args>(__args)...) {}532 533 template <class _Func, class... _Args>534 _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(535 std::__expected_construct_unexpected_from_invoke_tag __tag, _Func&& __f, _Args&&... __args)536 : __base(__tag, std::forward<_Func>(__f), std::forward<_Args>(__args)...) {}537 538public:539 template <class _Up, class _OtherErr>540 requires __can_convert<_Up, _OtherErr, const _Up&, const _OtherErr&>::value541 _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<const _Up&, _Tp> ||542 !is_convertible_v<const _OtherErr&, _Err>)543 expected(const expected<_Up, _OtherErr>& __other) noexcept(544 is_nothrow_constructible_v<_Tp, const _Up&> &&545 is_nothrow_constructible_v<_Err, const _OtherErr&>) // strengthened546 : __base(__other.__has_val(), __other.__union()) {}547 548 template <class _Up, class _OtherErr>549 requires __can_convert<_Up, _OtherErr, _Up, _OtherErr>::value550 _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_Up, _Tp> || !is_convertible_v<_OtherErr, _Err>)551 expected(expected<_Up, _OtherErr>&& __other) noexcept(552 is_nothrow_constructible_v<_Tp, _Up> && is_nothrow_constructible_v<_Err, _OtherErr>) // strengthened553 : __base(__other.__has_val(), std::move(__other.__union())) {}554 555 template <class _Up = remove_cv_t<_Tp>>556 requires(!is_same_v<remove_cvref_t<_Up>, in_place_t> && !is_same_v<expected, remove_cvref_t<_Up>> &&557 !is_same_v<remove_cvref_t<_Up>, unexpect_t> && is_constructible_v<_Tp, _Up> &&558 !__is_std_unexpected<remove_cvref_t<_Up>>::value &&559 (!is_same_v<remove_cv_t<_Tp>, bool> || !__is_std_expected<remove_cvref_t<_Up>>::value))560 _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_Up, _Tp>)561 expected(_Up&& __u) noexcept(is_nothrow_constructible_v<_Tp, _Up>) // strengthened562 : __base(in_place, std::forward<_Up>(__u)) {}563 564 template <class _OtherErr>565 requires is_constructible_v<_Err, const _OtherErr&>566 _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<const _OtherErr&, _Err>) expected(567 const unexpected<_OtherErr>& __unex) noexcept(is_nothrow_constructible_v<_Err, const _OtherErr&>) // strengthened568 : __base(unexpect, __unex.error()) {}569 570 template <class _OtherErr>571 requires is_constructible_v<_Err, _OtherErr>572 _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_OtherErr, _Err>)573 expected(unexpected<_OtherErr>&& __unex) noexcept(is_nothrow_constructible_v<_Err, _OtherErr>) // strengthened574 : __base(unexpect, std::move(__unex.error())) {}575 576 template <class... _Args>577 requires is_constructible_v<_Tp, _Args...>578 _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(in_place_t, _Args&&... __args) noexcept(579 is_nothrow_constructible_v<_Tp, _Args...>) // strengthened580 : __base(in_place, std::forward<_Args>(__args)...) {}581 582 template <class _Up, class... _Args>583 requires is_constructible_v< _Tp, initializer_list<_Up>&, _Args... >584 _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(in_place_t, initializer_list<_Up> __il, _Args&&... __args) noexcept(585 is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>) // strengthened586 : __base(in_place, __il, std::forward<_Args>(__args)...) {}587 588 template <class... _Args>589 requires is_constructible_v<_Err, _Args...>590 _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(unexpect_t, _Args&&... __args) noexcept(591 is_nothrow_constructible_v<_Err, _Args...>) // strengthened592 : __base(unexpect, std::forward<_Args>(__args)...) {}593 594 template <class _Up, class... _Args>595 requires is_constructible_v< _Err, initializer_list<_Up>&, _Args... >596 _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(unexpect_t, initializer_list<_Up> __il, _Args&&... __args) noexcept(597 is_nothrow_constructible_v<_Err, initializer_list<_Up>&, _Args...>) // strengthened598 : __base(unexpect, __il, std::forward<_Args>(__args)...) {}599 600 // [expected.object.dtor], destructor601 602 _LIBCPP_HIDE_FROM_ABI constexpr ~expected() = default;603 604private:605 template <class _Tag, class _OtherTag, class _T1, class _T2, class... _Args>606 _LIBCPP_HIDE_FROM_ABI constexpr void __reinit_expected(_T2& __oldval, _Args&&... __args) {607 if constexpr (is_nothrow_constructible_v<_T1, _Args...>) {608 this->__destroy();609 this->__construct(_Tag{}, std::forward<_Args>(__args)...);610 } else if constexpr (is_nothrow_move_constructible_v<_T1>) {611 _T1 __tmp(std::forward<_Args>(__args)...);612 this->__destroy();613 this->__construct(_Tag{}, std::move(__tmp));614 } else {615 static_assert(616 is_nothrow_move_constructible_v<_T2>,617 "To provide strong exception guarantee, T2 has to satisfy `is_nothrow_move_constructible_v` so that it can "618 "be reverted to the previous state in case an exception is thrown during the assignment.");619 _T2 __tmp(std::move(__oldval));620 this->__destroy();621 auto __trans = std::__make_exception_guard([&] { this->__construct(_OtherTag{}, std::move(__tmp)); });622 this->__construct(_Tag{}, std::forward<_Args>(__args)...);623 __trans.__complete();624 }625 }626 627public:628 // [expected.object.assign], assignment629 _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const expected&) = delete;630 631 _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const expected& __rhs) noexcept(632 is_nothrow_copy_assignable_v<_Tp> && is_nothrow_copy_constructible_v<_Tp> && is_nothrow_copy_assignable_v<_Err> &&633 is_nothrow_copy_constructible_v<_Err>) // strengthened634 requires(is_copy_assignable_v<_Tp> && is_copy_constructible_v<_Tp> && is_copy_assignable_v<_Err> &&635 is_copy_constructible_v<_Err> &&636 (is_nothrow_move_constructible_v<_Tp> || is_nothrow_move_constructible_v<_Err>))637 {638 if (this->__has_val() && __rhs.__has_val()) {639 this->__val() = __rhs.__val();640 } else if (this->__has_val()) {641 __reinit_expected<unexpect_t, in_place_t, _Err, _Tp>(this->__val(), __rhs.__unex());642 } else if (__rhs.__has_val()) {643 __reinit_expected<in_place_t, unexpect_t, _Tp, _Err>(this->__unex(), __rhs.__val());644 } else {645 this->__unex() = __rhs.__unex();646 }647 return *this;648 }649 650 _LIBCPP_HIDE_FROM_ABI constexpr expected&651 operator=(expected&& __rhs) noexcept(is_nothrow_move_assignable_v<_Tp> && is_nothrow_move_constructible_v<_Tp> &&652 is_nothrow_move_assignable_v<_Err> && is_nothrow_move_constructible_v<_Err>)653 requires(is_move_constructible_v<_Tp> && is_move_assignable_v<_Tp> && is_move_constructible_v<_Err> &&654 is_move_assignable_v<_Err> &&655 (is_nothrow_move_constructible_v<_Tp> || is_nothrow_move_constructible_v<_Err>))656 {657 if (this->__has_val() && __rhs.__has_val()) {658 this->__val() = std::move(__rhs.__val());659 } else if (this->__has_val()) {660 __reinit_expected<unexpect_t, in_place_t, _Err, _Tp>(this->__val(), std::move(__rhs.__unex()));661 } else if (__rhs.__has_val()) {662 __reinit_expected<in_place_t, unexpect_t, _Tp, _Err>(this->__unex(), std::move(__rhs.__val()));663 } else {664 this->__unex() = std::move(__rhs.__unex());665 }666 return *this;667 }668 669 template <class _Up = remove_cv_t<_Tp>>670 _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(_Up&& __v)671 requires(!is_same_v<expected, remove_cvref_t<_Up>> && !__is_std_unexpected<remove_cvref_t<_Up>>::value &&672 is_constructible_v<_Tp, _Up> && is_assignable_v<_Tp&, _Up> &&673 (is_nothrow_constructible_v<_Tp, _Up> || is_nothrow_move_constructible_v<_Tp> ||674 is_nothrow_move_constructible_v<_Err>))675 {676 if (this->__has_val()) {677 this->__val() = std::forward<_Up>(__v);678 } else {679 __reinit_expected<in_place_t, unexpect_t, _Tp, _Err>(this->__unex(), std::forward<_Up>(__v));680 }681 return *this;682 }683 684private:685 template <class _OtherErrQual>686 static constexpr bool __can_assign_from_unexpected =687 _And< is_constructible<_Err, _OtherErrQual>,688 is_assignable<_Err&, _OtherErrQual>,689 _Lazy<_Or,690 is_nothrow_constructible<_Err, _OtherErrQual>,691 is_nothrow_move_constructible<_Tp>,692 is_nothrow_move_constructible<_Err>> >::value;693 694public:695 template <class _OtherErr>696 requires(__can_assign_from_unexpected<const _OtherErr&>)697 _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const unexpected<_OtherErr>& __un) {698 if (this->__has_val()) {699 __reinit_expected<unexpect_t, in_place_t, _Err, _Tp>(this->__val(), __un.error());700 } else {701 this->__unex() = __un.error();702 }703 return *this;704 }705 706 template <class _OtherErr>707 requires(__can_assign_from_unexpected<_OtherErr>)708 _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(unexpected<_OtherErr>&& __un) {709 if (this->__has_val()) {710 __reinit_expected<unexpect_t, in_place_t, _Err, _Tp>(this->__val(), std::move(__un.error()));711 } else {712 this->__unex() = std::move(__un.error());713 }714 return *this;715 }716 717 template <class... _Args>718 requires is_nothrow_constructible_v<_Tp, _Args...>719 _LIBCPP_HIDE_FROM_ABI constexpr _Tp& emplace(_Args&&... __args) noexcept {720 this->__destroy();721 this->__construct(in_place, std::forward<_Args>(__args)...);722 return this->__val();723 }724 725 template <class _Up, class... _Args>726 requires is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>727 _LIBCPP_HIDE_FROM_ABI constexpr _Tp& emplace(initializer_list<_Up> __il, _Args&&... __args) noexcept {728 this->__destroy();729 this->__construct(in_place, __il, std::forward<_Args>(__args)...);730 return this->__val();731 }732 733public:734 // [expected.object.swap], swap735 _LIBCPP_HIDE_FROM_ABI constexpr void736 swap(expected& __rhs) noexcept(is_nothrow_move_constructible_v<_Tp> && is_nothrow_swappable_v<_Tp> &&737 is_nothrow_move_constructible_v<_Err> && is_nothrow_swappable_v<_Err>)738 requires(is_swappable_v<_Tp> && is_swappable_v<_Err> && is_move_constructible_v<_Tp> &&739 is_move_constructible_v<_Err> &&740 (is_nothrow_move_constructible_v<_Tp> || is_nothrow_move_constructible_v<_Err>))741 {742 auto __swap_val_unex_impl = [](expected& __with_val, expected& __with_err) {743 if constexpr (is_nothrow_move_constructible_v<_Err>) {744 _Err __tmp(std::move(__with_err.__unex()));745 __with_err.__destroy();746 auto __trans = std::__make_exception_guard([&] { __with_err.__construct(unexpect, std::move(__tmp)); });747 __with_err.__construct(in_place, std::move(__with_val.__val()));748 __trans.__complete();749 __with_val.__destroy();750 __with_val.__construct(unexpect, std::move(__tmp));751 } else {752 static_assert(is_nothrow_move_constructible_v<_Tp>,753 "To provide strong exception guarantee, Tp has to satisfy `is_nothrow_move_constructible_v` so "754 "that it can be reverted to the previous state in case an exception is thrown during swap.");755 _Tp __tmp(std::move(__with_val.__val()));756 __with_val.__destroy();757 auto __trans = std::__make_exception_guard([&] { __with_val.__construct(in_place, std::move(__tmp)); });758 __with_val.__construct(unexpect, std::move(__with_err.__unex()));759 __trans.__complete();760 __with_err.__destroy();761 __with_err.__construct(in_place, std::move(__tmp));762 }763 };764 765 if (this->__has_val()) {766 if (__rhs.__has_val()) {767 using std::swap;768 swap(this->__val(), __rhs.__val());769 } else {770 __swap_val_unex_impl(*this, __rhs);771 }772 } else {773 if (__rhs.__has_val()) {774 __swap_val_unex_impl(__rhs, *this);775 } else {776 using std::swap;777 swap(this->__unex(), __rhs.__unex());778 }779 }780 }781 782 _LIBCPP_HIDE_FROM_ABI friend constexpr void swap(expected& __x, expected& __y) noexcept(noexcept(__x.swap(__y)))783 requires requires { __x.swap(__y); }784 {785 __x.swap(__y);786 }787 788 // [expected.object.obs], observers789 _LIBCPP_HIDE_FROM_ABI constexpr const _Tp* operator->() const noexcept {790 _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(791 this->__has_val(), "expected::operator-> requires the expected to contain a value");792 return std::addressof(this->__val());793 }794 795 _LIBCPP_HIDE_FROM_ABI constexpr _Tp* operator->() noexcept {796 _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(797 this->__has_val(), "expected::operator-> requires the expected to contain a value");798 return std::addressof(this->__val());799 }800 801 _LIBCPP_HIDE_FROM_ABI constexpr const _Tp& operator*() const& noexcept {802 _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(803 this->__has_val(), "expected::operator* requires the expected to contain a value");804 return this->__val();805 }806 807 _LIBCPP_HIDE_FROM_ABI constexpr _Tp& operator*() & noexcept {808 _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(809 this->__has_val(), "expected::operator* requires the expected to contain a value");810 return this->__val();811 }812 813 _LIBCPP_HIDE_FROM_ABI constexpr const _Tp&& operator*() const&& noexcept {814 _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(815 this->__has_val(), "expected::operator* requires the expected to contain a value");816 return std::move(this->__val());817 }818 819 _LIBCPP_HIDE_FROM_ABI constexpr _Tp&& operator*() && noexcept {820 _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(821 this->__has_val(), "expected::operator* requires the expected to contain a value");822 return std::move(this->__val());823 }824 825 _LIBCPP_HIDE_FROM_ABI constexpr explicit operator bool() const noexcept { return this->__has_val(); }826 827 _LIBCPP_HIDE_FROM_ABI constexpr bool has_value() const noexcept { return this->__has_val(); }828 829 _LIBCPP_HIDE_FROM_ABI constexpr const _Tp& value() const& {830 static_assert(is_copy_constructible_v<_Err>, "error_type has to be copy constructible");831 if (!this->__has_val()) {832 std::__throw_bad_expected_access<_Err>(std::as_const(error()));833 }834 return this->__val();835 }836 837 _LIBCPP_HIDE_FROM_ABI constexpr _Tp& value() & {838 static_assert(is_copy_constructible_v<_Err>, "error_type has to be copy constructible");839 if (!this->__has_val()) {840 std::__throw_bad_expected_access<_Err>(std::as_const(error()));841 }842 return this->__val();843 }844 845 _LIBCPP_HIDE_FROM_ABI constexpr const _Tp&& value() const&& {846 static_assert(is_copy_constructible_v<_Err> && is_constructible_v<_Err, decltype(std::move(error()))>,847 "error_type has to be both copy constructible and constructible from decltype(std::move(error()))");848 if (!this->__has_val()) {849 std::__throw_bad_expected_access<_Err>(std::move(error()));850 }851 return std::move(this->__val());852 }853 854 _LIBCPP_HIDE_FROM_ABI constexpr _Tp&& value() && {855 static_assert(is_copy_constructible_v<_Err> && is_constructible_v<_Err, decltype(std::move(error()))>,856 "error_type has to be both copy constructible and constructible from decltype(std::move(error()))");857 if (!this->__has_val()) {858 std::__throw_bad_expected_access<_Err>(std::move(error()));859 }860 return std::move(this->__val());861 }862 863 _LIBCPP_HIDE_FROM_ABI constexpr const _Err& error() const& noexcept {864 _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(865 !this->__has_val(), "expected::error requires the expected to contain an error");866 return this->__unex();867 }868 869 _LIBCPP_HIDE_FROM_ABI constexpr _Err& error() & noexcept {870 _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(871 !this->__has_val(), "expected::error requires the expected to contain an error");872 return this->__unex();873 }874 875 _LIBCPP_HIDE_FROM_ABI constexpr const _Err&& error() const&& noexcept {876 _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(877 !this->__has_val(), "expected::error requires the expected to contain an error");878 return std::move(this->__unex());879 }880 881 _LIBCPP_HIDE_FROM_ABI constexpr _Err&& error() && noexcept {882 _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(883 !this->__has_val(), "expected::error requires the expected to contain an error");884 return std::move(this->__unex());885 }886 887 template <class _Up = remove_cv_t<_Tp>>888 _LIBCPP_HIDE_FROM_ABI constexpr _Tp value_or(_Up&& __v) const& {889 static_assert(is_copy_constructible_v<_Tp>, "value_type has to be copy constructible");890 static_assert(is_convertible_v<_Up, _Tp>, "argument has to be convertible to value_type");891 return this->__has_val() ? this->__val() : static_cast<_Tp>(std::forward<_Up>(__v));892 }893 894 template <class _Up = remove_cv_t<_Tp>>895 _LIBCPP_HIDE_FROM_ABI constexpr _Tp value_or(_Up&& __v) && {896 static_assert(is_move_constructible_v<_Tp>, "value_type has to be move constructible");897 static_assert(is_convertible_v<_Up, _Tp>, "argument has to be convertible to value_type");898 return this->__has_val() ? std::move(this->__val()) : static_cast<_Tp>(std::forward<_Up>(__v));899 }900 901 template <class _Up = _Err>902 _LIBCPP_HIDE_FROM_ABI constexpr _Err error_or(_Up&& __error) const& {903 static_assert(is_copy_constructible_v<_Err>, "error_type has to be copy constructible");904 static_assert(is_convertible_v<_Up, _Err>, "argument has to be convertible to error_type");905 if (has_value())906 return std::forward<_Up>(__error);907 return error();908 }909 910 template <class _Up = _Err>911 _LIBCPP_HIDE_FROM_ABI constexpr _Err error_or(_Up&& __error) && {912 static_assert(is_move_constructible_v<_Err>, "error_type has to be move constructible");913 static_assert(is_convertible_v<_Up, _Err>, "argument has to be convertible to error_type");914 if (has_value())915 return std::forward<_Up>(__error);916 return std::move(error());917 }918 919 // [expected.void.monadic], monadic920 template <class _Func>921 requires is_constructible_v<_Err, _Err&>922 _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) & {923 using _Up = remove_cvref_t<invoke_result_t<_Func, _Tp&>>;924 static_assert(__is_std_expected<_Up>::value, "The result of f(value()) must be a specialization of std::expected");925 static_assert(is_same_v<typename _Up::error_type, _Err>,926 "The result of f(value()) must have the same error_type as this expected");927 if (has_value()) {928 return std::invoke(std::forward<_Func>(__f), this->__val());929 }930 return _Up(unexpect, error());931 }932 933 template <class _Func>934 requires is_constructible_v<_Err, const _Err&>935 _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) const& {936 using _Up = remove_cvref_t<invoke_result_t<_Func, const _Tp&>>;937 static_assert(__is_std_expected<_Up>::value, "The result of f(value()) must be a specialization of std::expected");938 static_assert(is_same_v<typename _Up::error_type, _Err>,939 "The result of f(value()) must have the same error_type as this expected");940 if (has_value()) {941 return std::invoke(std::forward<_Func>(__f), this->__val());942 }943 return _Up(unexpect, error());944 }945 946 template <class _Func>947 requires is_constructible_v<_Err, _Err&&>948 _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) && {949 using _Up = remove_cvref_t<invoke_result_t<_Func, _Tp&&>>;950 static_assert(951 __is_std_expected<_Up>::value, "The result of f(std::move(value())) must be a specialization of std::expected");952 static_assert(is_same_v<typename _Up::error_type, _Err>,953 "The result of f(std::move(value())) must have the same error_type as this expected");954 if (has_value()) {955 return std::invoke(std::forward<_Func>(__f), std::move(this->__val()));956 }957 return _Up(unexpect, std::move(error()));958 }959 960 template <class _Func>961 requires is_constructible_v<_Err, const _Err&&>962 _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) const&& {963 using _Up = remove_cvref_t<invoke_result_t<_Func, const _Tp&&>>;964 static_assert(965 __is_std_expected<_Up>::value, "The result of f(std::move(value())) must be a specialization of std::expected");966 static_assert(is_same_v<typename _Up::error_type, _Err>,967 "The result of f(std::move(value())) must have the same error_type as this expected");968 if (has_value()) {969 return std::invoke(std::forward<_Func>(__f), std::move(this->__val()));970 }971 return _Up(unexpect, std::move(error()));972 }973 974 template <class _Func>975 requires is_constructible_v<_Tp, _Tp&>976 _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) & {977 using _Gp = remove_cvref_t<invoke_result_t<_Func, _Err&>>;978 static_assert(__is_std_expected<_Gp>::value, "The result of f(error()) must be a specialization of std::expected");979 static_assert(is_same_v<typename _Gp::value_type, _Tp>,980 "The result of f(error()) must have the same value_type as this expected");981 if (has_value()) {982 return _Gp(in_place, this->__val());983 }984 return std::invoke(std::forward<_Func>(__f), error());985 }986 987 template <class _Func>988 requires is_constructible_v<_Tp, const _Tp&>989 _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) const& {990 using _Gp = remove_cvref_t<invoke_result_t<_Func, const _Err&>>;991 static_assert(__is_std_expected<_Gp>::value, "The result of f(error()) must be a specialization of std::expected");992 static_assert(is_same_v<typename _Gp::value_type, _Tp>,993 "The result of f(error()) must have the same value_type as this expected");994 if (has_value()) {995 return _Gp(in_place, this->__val());996 }997 return std::invoke(std::forward<_Func>(__f), error());998 }999 1000 template <class _Func>1001 requires is_constructible_v<_Tp, _Tp&&>1002 _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) && {1003 using _Gp = remove_cvref_t<invoke_result_t<_Func, _Err&&>>;1004 static_assert(1005 __is_std_expected<_Gp>::value, "The result of f(std::move(error())) must be a specialization of std::expected");1006 static_assert(is_same_v<typename _Gp::value_type, _Tp>,1007 "The result of f(std::move(error())) must have the same value_type as this expected");1008 if (has_value()) {1009 return _Gp(in_place, std::move(this->__val()));1010 }1011 return std::invoke(std::forward<_Func>(__f), std::move(error()));1012 }1013 1014 template <class _Func>1015 requires is_constructible_v<_Tp, const _Tp&&>1016 _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) const&& {1017 using _Gp = remove_cvref_t<invoke_result_t<_Func, const _Err&&>>;1018 static_assert(1019 __is_std_expected<_Gp>::value, "The result of f(std::move(error())) must be a specialization of std::expected");1020 static_assert(is_same_v<typename _Gp::value_type, _Tp>,1021 "The result of f(std::move(error())) must have the same value_type as this expected");1022 if (has_value()) {1023 return _Gp(in_place, std::move(this->__val()));1024 }1025 return std::invoke(std::forward<_Func>(__f), std::move(error()));1026 }1027 1028 template <class _Func>1029 requires is_constructible_v<_Err, _Err&>1030 _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) & {1031 using _Up = remove_cv_t<invoke_result_t<_Func, _Tp&>>;1032 if (!has_value()) {1033 return expected<_Up, _Err>(unexpect, error());1034 }1035 if constexpr (!is_void_v<_Up>) {1036 return expected<_Up, _Err>(1037 __expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f), this->__val());1038 } else {1039 std::invoke(std::forward<_Func>(__f), this->__val());1040 return expected<_Up, _Err>();1041 }1042 }1043 1044 template <class _Func>1045 requires is_constructible_v<_Err, const _Err&>1046 _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) const& {1047 using _Up = remove_cv_t<invoke_result_t<_Func, const _Tp&>>;1048 if (!has_value()) {1049 return expected<_Up, _Err>(unexpect, error());1050 }1051 if constexpr (!is_void_v<_Up>) {1052 return expected<_Up, _Err>(1053 __expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f), this->__val());1054 } else {1055 std::invoke(std::forward<_Func>(__f), this->__val());1056 return expected<_Up, _Err>();1057 }1058 }1059 1060 template <class _Func>1061 requires is_constructible_v<_Err, _Err&&>1062 _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) && {1063 using _Up = remove_cv_t<invoke_result_t<_Func, _Tp&&>>;1064 if (!has_value()) {1065 return expected<_Up, _Err>(unexpect, std::move(error()));1066 }1067 if constexpr (!is_void_v<_Up>) {1068 return expected<_Up, _Err>(1069 __expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f), std::move(this->__val()));1070 } else {1071 std::invoke(std::forward<_Func>(__f), std::move(this->__val()));1072 return expected<_Up, _Err>();1073 }1074 }1075 1076 template <class _Func>1077 requires is_constructible_v<_Err, const _Err&&>1078 _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) const&& {1079 using _Up = remove_cv_t<invoke_result_t<_Func, const _Tp&&>>;1080 if (!has_value()) {1081 return expected<_Up, _Err>(unexpect, std::move(error()));1082 }1083 if constexpr (!is_void_v<_Up>) {1084 return expected<_Up, _Err>(1085 __expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f), std::move(this->__val()));1086 } else {1087 std::invoke(std::forward<_Func>(__f), std::move(this->__val()));1088 return expected<_Up, _Err>();1089 }1090 }1091 1092 template <class _Func>1093 requires is_constructible_v<_Tp, _Tp&>1094 _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) & {1095 using _Gp = remove_cv_t<invoke_result_t<_Func, _Err&>>;1096 static_assert(__valid_std_unexpected<_Gp>::value,1097 "The result of f(error()) must be a valid template argument for unexpected");1098 if (has_value()) {1099 return expected<_Tp, _Gp>(in_place, this->__val());1100 }1101 return expected<_Tp, _Gp>(__expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), error());1102 }1103 1104 template <class _Func>1105 requires is_constructible_v<_Tp, const _Tp&>1106 _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) const& {1107 using _Gp = remove_cv_t<invoke_result_t<_Func, const _Err&>>;1108 static_assert(__valid_std_unexpected<_Gp>::value,1109 "The result of f(error()) must be a valid template argument for unexpected");1110 if (has_value()) {1111 return expected<_Tp, _Gp>(in_place, this->__val());1112 }1113 return expected<_Tp, _Gp>(__expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), error());1114 }1115 1116 template <class _Func>1117 requires is_constructible_v<_Tp, _Tp&&>1118 _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) && {1119 using _Gp = remove_cv_t<invoke_result_t<_Func, _Err&&>>;1120 static_assert(__valid_std_unexpected<_Gp>::value,1121 "The result of f(std::move(error())) must be a valid template argument for unexpected");1122 if (has_value()) {1123 return expected<_Tp, _Gp>(in_place, std::move(this->__val()));1124 }1125 return expected<_Tp, _Gp>(1126 __expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), std::move(error()));1127 }1128 1129 template <class _Func>1130 requires is_constructible_v<_Tp, const _Tp&&>1131 _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) const&& {1132 using _Gp = remove_cv_t<invoke_result_t<_Func, const _Err&&>>;1133 static_assert(__valid_std_unexpected<_Gp>::value,1134 "The result of f(std::move(error())) must be a valid template argument for unexpected");1135 if (has_value()) {1136 return expected<_Tp, _Gp>(in_place, std::move(this->__val()));1137 }1138 return expected<_Tp, _Gp>(1139 __expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), std::move(error()));1140 }1141 1142 // [expected.object.eq], equality operators1143 template <class _T2, class _E2>1144 _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const expected<_T2, _E2>& __y)1145 requires(!is_void_v<_T2>)1146# if _LIBCPP_STD_VER >= 261147 && requires {1148 { *__x == *__y } -> __core_convertible_to<bool>;1149 { __x.error() == __y.error() } -> __core_convertible_to<bool>;1150 }1151# endif1152 {1153 if (__x.__has_val() != __y.__has_val()) {1154 return false;1155 } else {1156 if (__x.__has_val()) {1157 return __x.__val() == __y.__val();1158 } else {1159 return __x.__unex() == __y.__unex();1160 }1161 }1162 }1163 1164 template <class _T2>1165 _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const _T2& __v)1166# if _LIBCPP_STD_VER >= 261167 requires(!__is_std_expected<_T2>::value) && requires {1168 { *__x == __v } -> __core_convertible_to<bool>;1169 }1170# endif1171 {1172 return __x.__has_val() && static_cast<bool>(__x.__val() == __v);1173 }1174 1175 template <class _E2>1176 _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const unexpected<_E2>& __e)1177# if _LIBCPP_STD_VER >= 261178 requires requires {1179 { __x.error() == __e.error() } -> __core_convertible_to<bool>;1180 }1181# endif1182 {1183 return !__x.__has_val() && static_cast<bool>(__x.__unex() == __e.error());1184 }1185};1186 1187template <class _Err>1188class __expected_void_base {1189 struct __empty_t {};1190 // use named union because [[no_unique_address]] cannot be applied to an unnamed union,1191 // also guaranteed elision into a potentially-overlapping subobject is unsettled (and1192 // it's not clear that it's implementable, given that the function is allowed to clobber1193 // the tail padding) - see https://github.com/itanium-cxx-abi/cxx-abi/issues/107.1194 union __union_t {1195 _LIBCPP_HIDE_FROM_ABI constexpr __union_t(const __union_t&) = delete;1196 _LIBCPP_HIDE_FROM_ABI constexpr __union_t(const __union_t&)1197 requires(is_copy_constructible_v<_Err> && is_trivially_copy_constructible_v<_Err>)1198 = default;1199 _LIBCPP_HIDE_FROM_ABI constexpr __union_t(__union_t&&) = delete;1200 _LIBCPP_HIDE_FROM_ABI constexpr __union_t(__union_t&&)1201 requires(is_move_constructible_v<_Err> && is_trivially_move_constructible_v<_Err>)1202 = default;1203 _LIBCPP_HIDE_FROM_ABI constexpr __union_t& operator=(const __union_t&) = delete;1204 _LIBCPP_HIDE_FROM_ABI constexpr __union_t& operator=(__union_t&&) = delete;1205 1206 _LIBCPP_HIDE_FROM_ABI constexpr explicit __union_t(in_place_t) : __empty_() {}1207 1208 template <class... _Args>1209 _LIBCPP_HIDE_FROM_ABI constexpr explicit __union_t(unexpect_t, _Args&&... __args)1210 : __unex_(std::forward<_Args>(__args)...) {}1211 1212 template <class _Func, class... _Args>1213 _LIBCPP_HIDE_FROM_ABI constexpr explicit __union_t(1214 __expected_construct_unexpected_from_invoke_tag, _Func&& __f, _Args&&... __args)1215 : __unex_(std::invoke(std::forward<_Func>(__f), std::forward<_Args>(__args)...)) {}1216 1217 _LIBCPP_HIDE_FROM_ABI constexpr ~__union_t()1218 requires(is_trivially_destructible_v<_Err>)1219 = default;1220 1221 // __repr's destructor handles this1222 _LIBCPP_HIDE_FROM_ABI constexpr ~__union_t()1223 requires(!is_trivially_destructible_v<_Err>)1224 {}1225 1226 _LIBCPP_NO_UNIQUE_ADDRESS __empty_t __empty_;1227 _LIBCPP_NO_UNIQUE_ADDRESS _Err __unex_;1228 };1229 1230 static constexpr bool __put_flag_in_tail = __fits_in_tail_padding<__union_t, bool>;1231 static constexpr bool __allow_reusing_expected_tail_padding = !__put_flag_in_tail;1232 1233 struct __repr {1234 _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr() = delete;1235 1236 template <class... _Args>1237 _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(in_place_t __tag) : __union_(in_place, __tag), __has_val_(true) {}1238 1239 template <class... _Args>1240 _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(unexpect_t __tag, _Args&&... __args)1241 : __union_(in_place, __tag, std::forward<_Args>(__args)...), __has_val_(false) {}1242 1243 template <class... _Args>1244 _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(std::__expected_construct_unexpected_from_invoke_tag __tag,1245 _Args&&... __args)1246 : __union_(in_place, __tag, std::forward<_Args>(__args)...), __has_val_(false) {}1247 1248 template <class _OtherUnion>1249 _LIBCPP_HIDE_FROM_ABI constexpr explicit __repr(bool __has_val, _OtherUnion&& __other)1250 requires(__allow_reusing_expected_tail_padding)1251 : __union_(__conditional_no_unique_address_invoke_tag{},1252 [&] { return __make_union(__has_val, std::forward<_OtherUnion>(__other)); }),1253 __has_val_(__has_val) {}1254 1255 _LIBCPP_HIDE_FROM_ABI constexpr __repr(const __repr&) = delete;1256 _LIBCPP_HIDE_FROM_ABI constexpr __repr(const __repr&)1257 requires(is_copy_constructible_v<_Err> && is_trivially_copy_constructible_v<_Err>)1258 = default;1259 _LIBCPP_HIDE_FROM_ABI constexpr __repr(__repr&&) = delete;1260 _LIBCPP_HIDE_FROM_ABI constexpr __repr(__repr&&)1261 requires(is_move_constructible_v<_Err> && is_trivially_move_constructible_v<_Err>)1262 = default;1263 1264 _LIBCPP_HIDE_FROM_ABI constexpr __repr& operator=(const __repr&) = delete;1265 _LIBCPP_HIDE_FROM_ABI constexpr __repr& operator=(__repr&&) = delete;1266 1267 _LIBCPP_HIDE_FROM_ABI constexpr ~__repr()1268 requires(is_trivially_destructible_v<_Err>)1269 = default;1270 1271 _LIBCPP_HIDE_FROM_ABI constexpr ~__repr()1272 requires(!is_trivially_destructible_v<_Err>)1273 {1274 __destroy_union_member();1275 }1276 1277 _LIBCPP_HIDE_FROM_ABI constexpr void __destroy_union()1278 requires(__allow_reusing_expected_tail_padding && is_trivially_destructible_v<_Err>)1279 {1280 std::destroy_at(&__union_.__v);1281 }1282 1283 _LIBCPP_HIDE_FROM_ABI constexpr void __destroy_union()1284 requires(__allow_reusing_expected_tail_padding && !is_trivially_destructible_v<_Err>)1285 {1286 __destroy_union_member();1287 std::destroy_at(&__union_.__v);1288 }1289 1290 _LIBCPP_HIDE_FROM_ABI constexpr void __construct_union(in_place_t)1291 requires(__allow_reusing_expected_tail_padding)1292 {1293 std::construct_at(&__union_.__v, in_place);1294 __has_val_ = true;1295 }1296 1297 template <class... _Args>1298 _LIBCPP_HIDE_FROM_ABI constexpr void __construct_union(unexpect_t, _Args&&... __args)1299 requires(__allow_reusing_expected_tail_padding)1300 {1301 std::construct_at(&__union_.__v, unexpect, std::forward<_Args>(__args)...);1302 __has_val_ = false;1303 }1304 1305 private:1306 template <class>1307 friend class __expected_void_base;1308 1309 _LIBCPP_HIDE_FROM_ABI constexpr void __destroy_union_member()1310 requires(!is_trivially_destructible_v<_Err>)1311 {1312 if (!__has_val_)1313 std::destroy_at(std::addressof(__union_.__v.__unex_));1314 }1315 1316 template <class _OtherUnion>1317 _LIBCPP_HIDE_FROM_ABI static constexpr __union_t __make_union(bool __has_val, _OtherUnion&& __other)1318 requires(__allow_reusing_expected_tail_padding)1319 {1320 if (__has_val)1321 return __union_t(in_place);1322 else1323 return __union_t(unexpect, std::forward<_OtherUnion>(__other).__unex_);1324 }1325 1326 _LIBCPP_NO_UNIQUE_ADDRESS __conditional_no_unique_address<__put_flag_in_tail, __union_t> __union_;1327 _LIBCPP_NO_UNIQUE_ADDRESS bool __has_val_;1328 };1329 1330 template <class _OtherUnion>1331 _LIBCPP_HIDE_FROM_ABI static constexpr __repr __make_repr(bool __has_val, _OtherUnion&& __other)1332 requires(__put_flag_in_tail)1333 {1334 if (__has_val)1335 return __repr(in_place);1336 else1337 return __repr(unexpect, std::forward<_OtherUnion>(__other).__unex_);1338 }1339 1340protected:1341 template <class... _Args>1342 _LIBCPP_HIDE_FROM_ABI constexpr explicit __expected_void_base(_Args&&... __args)1343 : __repr_(in_place, std::forward<_Args>(__args)...) {}1344 1345 template <class _OtherUnion>1346 _LIBCPP_HIDE_FROM_ABI constexpr explicit __expected_void_base(bool __has_val, _OtherUnion&& __other)1347 requires(__put_flag_in_tail)1348 : __repr_(__conditional_no_unique_address_invoke_tag{},1349 [&] { return __make_repr(__has_val, std::forward<_OtherUnion>(__other)); }) {}1350 1351 _LIBCPP_HIDE_FROM_ABI constexpr void __destroy() {1352 if constexpr (__put_flag_in_tail)1353 std::destroy_at(&__repr_.__v);1354 else1355 __repr_.__v.__destroy_union();1356 }1357 1358 template <class _Tag, class... _Args>1359 _LIBCPP_HIDE_FROM_ABI constexpr void __construct(_Tag __tag, _Args&&... __args) {1360 if constexpr (__put_flag_in_tail)1361 std::construct_at(&__repr_.__v, __tag, std::forward<_Args>(__args)...);1362 else1363 __repr_.__v.__construct_union(__tag, std::forward<_Args>(__args)...);1364 }1365 1366 _LIBCPP_HIDE_FROM_ABI constexpr bool __has_val() const { return __repr_.__v.__has_val_; }1367 _LIBCPP_HIDE_FROM_ABI constexpr __union_t& __union() { return __repr_.__v.__union_.__v; }1368 _LIBCPP_HIDE_FROM_ABI constexpr const __union_t& __union() const { return __repr_.__v.__union_.__v; }1369 _LIBCPP_HIDE_FROM_ABI constexpr _Err& __unex() { return __repr_.__v.__union_.__v.__unex_; }1370 _LIBCPP_HIDE_FROM_ABI constexpr const _Err& __unex() const { return __repr_.__v.__union_.__v.__unex_; }1371 1372private:1373 _LIBCPP_NO_UNIQUE_ADDRESS __conditional_no_unique_address<__allow_reusing_expected_tail_padding, __repr> __repr_;1374};1375 1376template <class _Tp, class _Err>1377 requires is_void_v<_Tp>1378class expected<_Tp, _Err> : private __expected_void_base<_Err> {1379 static_assert(__valid_std_unexpected<_Err>::value,1380 "[expected.void.general] A program that instantiates expected<T, E> with a E that is not a "1381 "valid argument for unexpected<E> is ill-formed");1382 1383 template <class, class>1384 friend class expected;1385 1386 template <class _Up, class _OtherErr, class _OtherErrQual>1387 using __can_convert _LIBCPP_NODEBUG =1388 _And< is_void<_Up>,1389 is_constructible<_Err, _OtherErrQual>,1390 _Not<is_constructible<unexpected<_Err>, expected<_Up, _OtherErr>&>>,1391 _Not<is_constructible<unexpected<_Err>, expected<_Up, _OtherErr>>>,1392 _Not<is_constructible<unexpected<_Err>, const expected<_Up, _OtherErr>&>>,1393 _Not<is_constructible<unexpected<_Err>, const expected<_Up, _OtherErr>>>>;1394 1395 using __base _LIBCPP_NODEBUG = __expected_void_base<_Err>;1396 1397public:1398 using value_type = _Tp;1399 using error_type = _Err;1400 using unexpected_type = unexpected<_Err>;1401 1402 template <class _Up>1403 using rebind = expected<_Up, error_type>;1404 1405 // [expected.void.ctor], constructors1406 _LIBCPP_HIDE_FROM_ABI constexpr expected() noexcept : __base(in_place) {}1407 1408 _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected&) = delete;1409 1410 _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected&)1411 requires(is_copy_constructible_v<_Err> && is_trivially_copy_constructible_v<_Err>)1412 = default;1413 1414 _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected& __rhs) noexcept(1415 is_nothrow_copy_constructible_v<_Err>) // strengthened1416 requires(is_copy_constructible_v<_Err> && !is_trivially_copy_constructible_v<_Err>)1417 : __base(__rhs.__has_val(), __rhs.__union()) {}1418 1419 _LIBCPP_HIDE_FROM_ABI constexpr expected(expected&&)1420 requires(is_move_constructible_v<_Err> && is_trivially_move_constructible_v<_Err>)1421 = default;1422 1423 _LIBCPP_HIDE_FROM_ABI constexpr expected(expected&& __rhs) noexcept(is_nothrow_move_constructible_v<_Err>)1424 requires(is_move_constructible_v<_Err> && !is_trivially_move_constructible_v<_Err>)1425 : __base(__rhs.__has_val(), std::move(__rhs.__union())) {}1426 1427 template <class _Up, class _OtherErr>1428 requires __can_convert<_Up, _OtherErr, const _OtherErr&>::value1429 _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<const _OtherErr&, _Err>)1430 expected(const expected<_Up, _OtherErr>& __rhs) noexcept(1431 is_nothrow_constructible_v<_Err, const _OtherErr&>) // strengthened1432 : __base(__rhs.__has_val(), __rhs.__union()) {}1433 1434 template <class _Up, class _OtherErr>1435 requires __can_convert<_Up, _OtherErr, _OtherErr>::value1436 _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_OtherErr, _Err>)1437 expected(expected<_Up, _OtherErr>&& __rhs) noexcept(is_nothrow_constructible_v<_Err, _OtherErr>) // strengthened1438 : __base(__rhs.__has_val(), std::move(__rhs.__union())) {}1439 1440 template <class _OtherErr>1441 requires is_constructible_v<_Err, const _OtherErr&>1442 _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<const _OtherErr&, _Err>) expected(1443 const unexpected<_OtherErr>& __unex) noexcept(is_nothrow_constructible_v<_Err, const _OtherErr&>) // strengthened1444 : __base(unexpect, __unex.error()) {}1445 1446 template <class _OtherErr>1447 requires is_constructible_v<_Err, _OtherErr>1448 _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_OtherErr, _Err>)1449 expected(unexpected<_OtherErr>&& __unex) noexcept(is_nothrow_constructible_v<_Err, _OtherErr>) // strengthened1450 : __base(unexpect, std::move(__unex.error())) {}1451 1452 _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(in_place_t) noexcept : __base(in_place) {}1453 1454 template <class... _Args>1455 requires is_constructible_v<_Err, _Args...>1456 _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(unexpect_t, _Args&&... __args) noexcept(1457 is_nothrow_constructible_v<_Err, _Args...>) // strengthened1458 : __base(unexpect, std::forward<_Args>(__args)...) {}1459 1460 template <class _Up, class... _Args>1461 requires is_constructible_v< _Err, initializer_list<_Up>&, _Args... >1462 _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(unexpect_t, initializer_list<_Up> __il, _Args&&... __args) noexcept(1463 is_nothrow_constructible_v<_Err, initializer_list<_Up>&, _Args...>) // strengthened1464 : __base(unexpect, __il, std::forward<_Args>(__args)...) {}1465 1466private:1467 template <class _Func, class... _Args>1468 _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(1469 __expected_construct_unexpected_from_invoke_tag __tag, _Func&& __f, _Args&&... __args)1470 : __base(__tag, std::forward<_Func>(__f), std::forward<_Args>(__args)...) {}1471 1472public:1473 // [expected.void.dtor], destructor1474 1475 _LIBCPP_HIDE_FROM_ABI constexpr ~expected() = default;1476 1477private:1478 template <class... _Args>1479 _LIBCPP_HIDE_FROM_ABI constexpr void __reinit_expected(unexpect_t, _Args&&... __args) {1480 _LIBCPP_ASSERT_INTERNAL(this->__has_val(), "__reinit_expected(unexpect_t, ...) needs value to be set");1481 1482 this->__destroy();1483 auto __trans = std::__make_exception_guard([&] { this->__construct(in_place); });1484 this->__construct(unexpect, std::forward<_Args>(__args)...);1485 __trans.__complete();1486 }1487 1488 _LIBCPP_HIDE_FROM_ABI constexpr void __reinit_expected(in_place_t) {1489 _LIBCPP_ASSERT_INTERNAL(!this->__has_val(), "__reinit_expected(in_place_t, ...) needs value to be unset");1490 1491 this->__destroy();1492 this->__construct(in_place);1493 }1494 1495public:1496 // [expected.void.assign], assignment1497 _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const expected&) = delete;1498 1499 _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const expected& __rhs) noexcept(1500 is_nothrow_copy_assignable_v<_Err> && is_nothrow_copy_constructible_v<_Err>) // strengthened1501 requires(is_copy_assignable_v<_Err> && is_copy_constructible_v<_Err>)1502 {1503 if (this->__has_val()) {1504 if (!__rhs.__has_val()) {1505 __reinit_expected(unexpect, __rhs.__unex());1506 }1507 } else {1508 if (__rhs.__has_val()) {1509 __reinit_expected(in_place);1510 } else {1511 this->__unex() = __rhs.__unex();1512 }1513 }1514 return *this;1515 }1516 1517 _LIBCPP_HIDE_FROM_ABI constexpr expected&1518 operator=(expected&& __rhs) noexcept(is_nothrow_move_assignable_v<_Err> && is_nothrow_move_constructible_v<_Err>)1519 requires(is_move_assignable_v<_Err> && is_move_constructible_v<_Err>)1520 {1521 if (this->__has_val()) {1522 if (!__rhs.__has_val()) {1523 __reinit_expected(unexpect, std::move(__rhs.__unex()));1524 }1525 } else {1526 if (__rhs.__has_val()) {1527 __reinit_expected(in_place);1528 } else {1529 this->__unex() = std::move(__rhs.__unex());1530 }1531 }1532 return *this;1533 }1534 1535 template <class _OtherErr>1536 requires(is_constructible_v<_Err, const _OtherErr&> && is_assignable_v<_Err&, const _OtherErr&>)1537 _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const unexpected<_OtherErr>& __un) {1538 if (this->__has_val()) {1539 __reinit_expected(unexpect, __un.error());1540 } else {1541 this->__unex() = __un.error();1542 }1543 return *this;1544 }1545 1546 template <class _OtherErr>1547 requires(is_constructible_v<_Err, _OtherErr> && is_assignable_v<_Err&, _OtherErr>)1548 _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(unexpected<_OtherErr>&& __un) {1549 if (this->__has_val()) {1550 __reinit_expected(unexpect, std::move(__un.error()));1551 } else {1552 this->__unex() = std::move(__un.error());1553 }1554 return *this;1555 }1556 1557 _LIBCPP_HIDE_FROM_ABI constexpr void emplace() noexcept {1558 if (!this->__has_val()) {1559 __reinit_expected(in_place);1560 }1561 }1562 1563 // [expected.void.swap], swap1564 _LIBCPP_HIDE_FROM_ABI constexpr void1565 swap(expected& __rhs) noexcept(is_nothrow_move_constructible_v<_Err> && is_nothrow_swappable_v<_Err>)1566 requires(is_swappable_v<_Err> && is_move_constructible_v<_Err>)1567 {1568 auto __swap_val_unex_impl = [](expected& __with_val, expected& __with_err) {1569 // May throw, but will re-engage `__with_val` in that case.1570 __with_val.__reinit_expected(unexpect, std::move(__with_err.__unex()));1571 // Will not throw.1572 __with_err.__reinit_expected(in_place);1573 };1574 1575 if (this->__has_val()) {1576 if (!__rhs.__has_val()) {1577 __swap_val_unex_impl(*this, __rhs);1578 }1579 } else {1580 if (__rhs.__has_val()) {1581 __swap_val_unex_impl(__rhs, *this);1582 } else {1583 using std::swap;1584 swap(this->__unex(), __rhs.__unex());1585 }1586 }1587 }1588 1589 _LIBCPP_HIDE_FROM_ABI friend constexpr void swap(expected& __x, expected& __y) noexcept(noexcept(__x.swap(__y)))1590 requires requires { __x.swap(__y); }1591 {1592 __x.swap(__y);1593 }1594 1595 // [expected.void.obs], observers1596 _LIBCPP_HIDE_FROM_ABI constexpr explicit operator bool() const noexcept { return this->__has_val(); }1597 1598 _LIBCPP_HIDE_FROM_ABI constexpr bool has_value() const noexcept { return this->__has_val(); }1599 1600 _LIBCPP_HIDE_FROM_ABI constexpr void operator*() const noexcept {1601 _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(1602 this->__has_val(), "expected::operator* requires the expected to contain a value");1603 }1604 1605 _LIBCPP_HIDE_FROM_ABI constexpr void value() const& {1606 static_assert(is_copy_constructible_v<_Err>);1607 if (!this->__has_val()) {1608 std::__throw_bad_expected_access<_Err>(this->__unex());1609 }1610 }1611 1612 _LIBCPP_HIDE_FROM_ABI constexpr void value() && {1613 static_assert(is_copy_constructible_v<_Err> && is_move_constructible_v<_Err>);1614 if (!this->__has_val()) {1615 std::__throw_bad_expected_access<_Err>(std::move(this->__unex()));1616 }1617 }1618 1619 _LIBCPP_HIDE_FROM_ABI constexpr const _Err& error() const& noexcept {1620 _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(1621 !this->__has_val(), "expected::error requires the expected to contain an error");1622 return this->__unex();1623 }1624 1625 _LIBCPP_HIDE_FROM_ABI constexpr _Err& error() & noexcept {1626 _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(1627 !this->__has_val(), "expected::error requires the expected to contain an error");1628 return this->__unex();1629 }1630 1631 _LIBCPP_HIDE_FROM_ABI constexpr const _Err&& error() const&& noexcept {1632 _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(1633 !this->__has_val(), "expected::error requires the expected to contain an error");1634 return std::move(this->__unex());1635 }1636 1637 _LIBCPP_HIDE_FROM_ABI constexpr _Err&& error() && noexcept {1638 _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(1639 !this->__has_val(), "expected::error requires the expected to contain an error");1640 return std::move(this->__unex());1641 }1642 1643 template <class _Up = _Err>1644 _LIBCPP_HIDE_FROM_ABI constexpr _Err error_or(_Up&& __error) const& {1645 static_assert(is_copy_constructible_v<_Err>, "error_type has to be copy constructible");1646 static_assert(is_convertible_v<_Up, _Err>, "argument has to be convertible to error_type");1647 if (has_value()) {1648 return std::forward<_Up>(__error);1649 }1650 return error();1651 }1652 1653 template <class _Up = _Err>1654 _LIBCPP_HIDE_FROM_ABI constexpr _Err error_or(_Up&& __error) && {1655 static_assert(is_move_constructible_v<_Err>, "error_type has to be move constructible");1656 static_assert(is_convertible_v<_Up, _Err>, "argument has to be convertible to error_type");1657 if (has_value()) {1658 return std::forward<_Up>(__error);1659 }1660 return std::move(error());1661 }1662 1663 // [expected.void.monadic], monadic1664 template <class _Func>1665 requires is_constructible_v<_Err, _Err&>1666 _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) & {1667 using _Up = remove_cvref_t<invoke_result_t<_Func>>;1668 static_assert(__is_std_expected<_Up>::value, "The result of f() must be a specialization of std::expected");1669 static_assert(1670 is_same_v<typename _Up::error_type, _Err>, "The result of f() must have the same error_type as this expected");1671 if (has_value()) {1672 return std::invoke(std::forward<_Func>(__f));1673 }1674 return _Up(unexpect, error());1675 }1676 1677 template <class _Func>1678 requires is_constructible_v<_Err, const _Err&>1679 _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) const& {1680 using _Up = remove_cvref_t<invoke_result_t<_Func>>;1681 static_assert(__is_std_expected<_Up>::value, "The result of f() must be a specialization of std::expected");1682 static_assert(1683 is_same_v<typename _Up::error_type, _Err>, "The result of f() must have the same error_type as this expected");1684 if (has_value()) {1685 return std::invoke(std::forward<_Func>(__f));1686 }1687 return _Up(unexpect, error());1688 }1689 1690 template <class _Func>1691 requires is_constructible_v<_Err, _Err&&>1692 _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) && {1693 using _Up = remove_cvref_t<invoke_result_t<_Func>>;1694 static_assert(__is_std_expected<_Up>::value, "The result of f() must be a specialization of std::expected");1695 static_assert(1696 is_same_v<typename _Up::error_type, _Err>, "The result of f() must have the same error_type as this expected");1697 if (has_value()) {1698 return std::invoke(std::forward<_Func>(__f));1699 }1700 return _Up(unexpect, std::move(error()));1701 }1702 1703 template <class _Func>1704 requires is_constructible_v<_Err, const _Err&&>1705 _LIBCPP_HIDE_FROM_ABI constexpr auto and_then(_Func&& __f) const&& {1706 using _Up = remove_cvref_t<invoke_result_t<_Func>>;1707 static_assert(__is_std_expected<_Up>::value, "The result of f() must be a specialization of std::expected");1708 static_assert(1709 is_same_v<typename _Up::error_type, _Err>, "The result of f() must have the same error_type as this expected");1710 if (has_value()) {1711 return std::invoke(std::forward<_Func>(__f));1712 }1713 return _Up(unexpect, std::move(error()));1714 }1715 1716 template <class _Func>1717 _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) & {1718 using _Gp = remove_cvref_t<invoke_result_t<_Func, _Err&>>;1719 static_assert(__is_std_expected<_Gp>::value, "The result of f(error()) must be a specialization of std::expected");1720 static_assert(is_same_v<typename _Gp::value_type, _Tp>,1721 "The result of f(error()) must have the same value_type as this expected");1722 if (has_value()) {1723 return _Gp();1724 }1725 return std::invoke(std::forward<_Func>(__f), error());1726 }1727 1728 template <class _Func>1729 _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) const& {1730 using _Gp = remove_cvref_t<invoke_result_t<_Func, const _Err&>>;1731 static_assert(__is_std_expected<_Gp>::value, "The result of f(error()) must be a specialization of std::expected");1732 static_assert(is_same_v<typename _Gp::value_type, _Tp>,1733 "The result of f(error()) must have the same value_type as this expected");1734 if (has_value()) {1735 return _Gp();1736 }1737 return std::invoke(std::forward<_Func>(__f), error());1738 }1739 1740 template <class _Func>1741 _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) && {1742 using _Gp = remove_cvref_t<invoke_result_t<_Func, _Err&&>>;1743 static_assert(1744 __is_std_expected<_Gp>::value, "The result of f(std::move(error())) must be a specialization of std::expected");1745 static_assert(is_same_v<typename _Gp::value_type, _Tp>,1746 "The result of f(std::move(error())) must have the same value_type as this expected");1747 if (has_value()) {1748 return _Gp();1749 }1750 return std::invoke(std::forward<_Func>(__f), std::move(error()));1751 }1752 1753 template <class _Func>1754 _LIBCPP_HIDE_FROM_ABI constexpr auto or_else(_Func&& __f) const&& {1755 using _Gp = remove_cvref_t<invoke_result_t<_Func, const _Err&&>>;1756 static_assert(1757 __is_std_expected<_Gp>::value, "The result of f(std::move(error())) must be a specialization of std::expected");1758 static_assert(is_same_v<typename _Gp::value_type, _Tp>,1759 "The result of f(std::move(error())) must have the same value_type as this expected");1760 if (has_value()) {1761 return _Gp();1762 }1763 return std::invoke(std::forward<_Func>(__f), std::move(error()));1764 }1765 1766 template <class _Func>1767 requires is_constructible_v<_Err, _Err&>1768 _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) & {1769 using _Up = remove_cv_t<invoke_result_t<_Func>>;1770 if (!has_value()) {1771 return expected<_Up, _Err>(unexpect, error());1772 }1773 if constexpr (!is_void_v<_Up>) {1774 return expected<_Up, _Err>(__expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f));1775 } else {1776 std::invoke(std::forward<_Func>(__f));1777 return expected<_Up, _Err>();1778 }1779 }1780 1781 template <class _Func>1782 requires is_constructible_v<_Err, const _Err&>1783 _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) const& {1784 using _Up = remove_cv_t<invoke_result_t<_Func>>;1785 if (!has_value()) {1786 return expected<_Up, _Err>(unexpect, error());1787 }1788 if constexpr (!is_void_v<_Up>) {1789 return expected<_Up, _Err>(__expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f));1790 } else {1791 std::invoke(std::forward<_Func>(__f));1792 return expected<_Up, _Err>();1793 }1794 }1795 1796 template <class _Func>1797 requires is_constructible_v<_Err, _Err&&>1798 _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) && {1799 using _Up = remove_cv_t<invoke_result_t<_Func>>;1800 if (!has_value()) {1801 return expected<_Up, _Err>(unexpect, std::move(error()));1802 }1803 if constexpr (!is_void_v<_Up>) {1804 return expected<_Up, _Err>(__expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f));1805 } else {1806 std::invoke(std::forward<_Func>(__f));1807 return expected<_Up, _Err>();1808 }1809 }1810 1811 template <class _Func>1812 requires is_constructible_v<_Err, const _Err&&>1813 _LIBCPP_HIDE_FROM_ABI constexpr auto transform(_Func&& __f) const&& {1814 using _Up = remove_cv_t<invoke_result_t<_Func>>;1815 if (!has_value()) {1816 return expected<_Up, _Err>(unexpect, std::move(error()));1817 }1818 if constexpr (!is_void_v<_Up>) {1819 return expected<_Up, _Err>(__expected_construct_in_place_from_invoke_tag{}, std::forward<_Func>(__f));1820 } else {1821 std::invoke(std::forward<_Func>(__f));1822 return expected<_Up, _Err>();1823 }1824 }1825 1826 template <class _Func>1827 _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) & {1828 using _Gp = remove_cv_t<invoke_result_t<_Func, _Err&>>;1829 static_assert(__valid_std_unexpected<_Gp>::value,1830 "The result of f(error()) must be a valid template argument for unexpected");1831 if (has_value()) {1832 return expected<_Tp, _Gp>();1833 }1834 return expected<_Tp, _Gp>(__expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), error());1835 }1836 1837 template <class _Func>1838 _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) const& {1839 using _Gp = remove_cv_t<invoke_result_t<_Func, const _Err&>>;1840 static_assert(__valid_std_unexpected<_Gp>::value,1841 "The result of f(error()) must be a valid template argument for unexpected");1842 if (has_value()) {1843 return expected<_Tp, _Gp>();1844 }1845 return expected<_Tp, _Gp>(__expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), error());1846 }1847 1848 template <class _Func>1849 _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) && {1850 using _Gp = remove_cv_t<invoke_result_t<_Func, _Err&&>>;1851 static_assert(__valid_std_unexpected<_Gp>::value,1852 "The result of f(std::move(error())) must be a valid template argument for unexpected");1853 if (has_value()) {1854 return expected<_Tp, _Gp>();1855 }1856 return expected<_Tp, _Gp>(1857 __expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), std::move(error()));1858 }1859 1860 template <class _Func>1861 _LIBCPP_HIDE_FROM_ABI constexpr auto transform_error(_Func&& __f) const&& {1862 using _Gp = remove_cv_t<invoke_result_t<_Func, const _Err&&>>;1863 static_assert(__valid_std_unexpected<_Gp>::value,1864 "The result of f(std::move(error())) must be a valid template argument for unexpected");1865 if (has_value()) {1866 return expected<_Tp, _Gp>();1867 }1868 return expected<_Tp, _Gp>(1869 __expected_construct_unexpected_from_invoke_tag{}, std::forward<_Func>(__f), std::move(error()));1870 }1871 1872 // [expected.void.eq], equality operators1873 template <class _T2, class _E2>1874 requires is_void_v<_T2>1875 _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const expected<_T2, _E2>& __y)1876# if _LIBCPP_STD_VER >= 261877 requires requires {1878 { __x.error() == __y.error() } -> __core_convertible_to<bool>;1879 }1880# endif1881 {1882 if (__x.__has_val() != __y.__has_val()) {1883 return false;1884 } else {1885 return __x.__has_val() || static_cast<bool>(__x.__unex() == __y.__unex());1886 }1887 }1888 1889 template <class _E2>1890 _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const unexpected<_E2>& __y)1891# if _LIBCPP_STD_VER >= 261892 requires requires {1893 { __x.error() == __y.error() } -> __core_convertible_to<bool>;1894 }1895# endif1896 {1897 return !__x.__has_val() && static_cast<bool>(__x.__unex() == __y.error());1898 }1899};1900 1901_LIBCPP_END_NAMESPACE_STD1902 1903#endif // _LIBCPP_STD_VER >= 231904 1905_LIBCPP_POP_MACROS1906 1907#endif // _LIBCPP___EXPECTED_EXPECTED_H1908