8#ifndef DESIGNLAB_UNEXPECTED_H_
9#define DESIGNLAB_UNEXPECTED_H_
11#include <initializer_list>
23 template <
typename Err>
25 !std::is_same_v<std::remove_cvref_t<Err>,
unexpected>;
27 template <
typename Err>
29 !std::is_same_v<std::remove_cvref_t<Err>, std::in_place_t>;
31 template <
typename Err>
34 template <
typename Err>
36 param_concept3_1<Err> && param_concept3_2<Err> && param_concept3_3<Err>;
38 template <
typename... Args>
41 template <
typename U,
typename... Args>
43 std::is_constructible_v<E, std::initializer_list<U>, Args...>;
50 template <
typename Err = E,
51 std::enable_if_t<param_concept3<Err>, std::nullptr_t> =
nullptr>
52 constexpr explicit unexpected(
const Err& e) : error_(e) {}
54 template <
typename... Args,
55 std::enable_if_t<
param_concept4<Args...>, std::nullptr_t> =
nullptr>
56 constexpr explicit unexpected(std::in_place_t, Args&&... args)
57 : error_(
std::forward<Args>(args)...) {}
60 typename U,
typename... Args,
61 std::enable_if_t<
param_concept5<U, Args...>, std::nullptr_t> =
nullptr>
62 constexpr explicit unexpected(std::in_place_t, std::initializer_list<U> il,
64 : error_(il,
std::forward<Args>(args)...) {}
72 template <
typename E2>
75 template <
typename E2>
79 constexpr const E&
error() const& noexcept {
return error_; }
80 constexpr E&
error() &
noexcept {
return error_; }
81 constexpr E&&
error() &&
noexcept {
return std::move(error_); }
104 return !(lhs == rhs);
109 "unexpected<int>のerror()が正しく動作しません。");
111static_assert(unexpected<std::string>{
"error"}.error() ==
"error",
112 "unexpected<std::string>のerror()が正しく動作しません。");
constexpr ~unexpected()=default
constexpr unexpected & operator=(unexpected &&)=default
friend constexpr bool operator!=(const unexpected< E2 > &lhs, const unexpected< E2 > &rhs)
friend constexpr bool operator==(const unexpected< E2 > &lhs, const unexpected< E2 > &rhs)
constexpr unexpected & operator=(const unexpected &)=default
static constexpr bool param_concept5
constexpr unexpected(unexpected &&)=default
ムーブコンストラクタ
static constexpr bool param_concept3_2
constexpr E & error() &noexcept
constexpr unexpected(const Err &e)
static constexpr bool param_concept3_1
constexpr const E & error() const &noexcept
constexpr unexpected(const unexpected &)=default
コピーコンストラクタ
static constexpr bool param_concept3_3
static constexpr bool param_concept3
static constexpr bool param_concept4
constexpr unexpected(std::in_place_t, Args &&... args)
constexpr E && error() &&noexcept
constexpr unexpected(std::in_place_t, std::initializer_list< U > il, Args &&... args)
constexpr unexpected< std::decay_t< E > > make_unexpected(E &&e)
constexpr bool operator==(const unexpected< E > &lhs, const unexpected< E > &rhs)
constexpr bool operator!=(const unexpected< E > &lhs, const unexpected< E > &rhs)