46 using std::optional<T>::optional;
53 std::is_nothrow_move_constructible_v<T>)
56 if (that) { this->emplace(std::move(*that)); }
63 std::conditional_t<std::is_move_assignable_v<T>,
75 std::is_nothrow_copy_constructible_v<T>)
78 if (that) { this->emplace(*that); }
86 std::conditional_t<
std::is_copy_assignable_v<T>,
97 [[nodiscard]]
constexpr T&
get() & {
return **
this; }
98 [[nodiscard]]
constexpr T
const&
get() const& {
return **
this; }
99 [[nodiscard]]
constexpr T&&
get() && {
return *std::move(*
this); }
100 [[nodiscard]]
constexpr T
const&&
get() const&& {
return *std::move(*
this); }
102 constexpr operator T&() & {
return **
this; }
103 constexpr operator const T&()
const& {
return **
this; }
104 constexpr operator T &&() && {
return *std::move(*
this); }
105 constexpr operator const T &&()
const&& {
return *std::move(*
this); }
107 template<
typename... Args>
constexpr auto operator()(Args&&... args) &
109 return (**
this)(
static_cast<Args&&
>(args)...);
111 template<
typename... Args>
constexpr auto operator()(Args&&... args)
const&
113 return (**
this)(
static_cast<Args&&
>(args)...);
115 template<
typename... Args>
constexpr auto operator()(Args&&... args) &&
117 return (*std::move(*
this))(
static_cast<Args&&
>(args)...);
119 template<
typename... Args>
constexpr auto operator()(Args&&... args)
const&&
121 return (*std::move(*
this))(
static_cast<Args&&
>(args)...);
127 constexpr semiregular(tag, std::false_type) {}
128 constexpr semiregular(tag, std::true_type)
139 template<
typename Arg, std::enable_if_t<(std::is_constructible<
140 std::reference_wrapper<T&>,
141 Arg&>::value)>* =
nullptr>
142 constexpr semiregular(std::in_place_t, Arg& arg) : std::reference_wrapper<T&>(arg)
146 using std::reference_wrapper<T&>::reference_wrapper;
147 using std::reference_wrapper<T&>::get;
148 using std::reference_wrapper<T&>::operator T&;
149 using std::reference_wrapper<T&>::operator();
156 template<
typename Arg, std::enable_if_t<(std::is_constructible<
157 std::reference_wrapper<T&&>,
158 Arg>::value)>* =
nullptr>
160 : std::reference_wrapper<T&>(
static_cast<Arg&&
>(arg))
164 using std::reference_wrapper<T&&>::reference_wrapper;
165 using std::reference_wrapper<T&&>::get;
166 using std::reference_wrapper<T&&>::operator T&&;
167 using std::reference_wrapper<T&&>::operator();
174 std::conditional_t<std::is_default_constructible_v<T> &&
175 std::is_copy_assignable_v<T>,
std::conditional_t< std::is_move_assignable_v< T >, std::optional< T >, semiregular_move_assign< T > > semiregular_move_layer
std::conditional_t< std::is_copy_assignable_v< T >, std::optional< T >, semiregular_copy_assign< T > > semiregular_copy_layer
std::conditional_t< std::is_default_constructible_v< T > &&std::is_copy_assignable_v< T >, T, sreg_impl::semiregular< T > > semiregular_t
constexpr semiregular(std::in_place_t, Arg &arg)
constexpr semiregular(std::in_place_t, Arg &&arg)
constexpr semiregular_copy_assign()=default
constexpr semiregular_copy_assign & operator=(semiregular_copy_assign &&) noexcept=default
constexpr semiregular_copy_assign(const semiregular_copy_assign &)=default
constexpr semiregular_copy_assign(semiregular_copy_assign &&) noexcept=default
constexpr semiregular_move_assign()=default
constexpr semiregular_move_assign(const semiregular_move_assign &)=default
constexpr semiregular_move_assign(semiregular_move_assign &&) noexcept=default
constexpr T const && get() const &&
constexpr auto operator()(Args &&... args) const &
constexpr auto operator()(Args &&... args) &
constexpr auto operator()(Args &&... args) &&
constexpr T const & get() const &
constexpr auto operator()(Args &&... args) const &&