46 using std::optional<T>::optional;
54 std::is_nothrow_move_constructible_v<T>)
57 if (that) { this->emplace(std::move(*that)); }
64 std::conditional_t<std::is_move_assignable_v<T>,
77 std::is_nothrow_copy_constructible_v<T>)
80 if (that) { this->emplace(*that); }
88 std::conditional_t<
std::is_copy_assignable_v<T>,
99 [[nodiscard]]
constexpr T&
get() & {
return **
this; }
100 [[nodiscard]]
constexpr T
const&
get() const& {
return **
this; }
101 [[nodiscard]]
constexpr T&&
get() && {
return *std::move(*
this); }
102 [[nodiscard]]
constexpr T
const&&
get() const&& {
return *std::move(*
this); }
104 constexpr operator T&() & {
return **
this; }
105 constexpr operator const T&()
const& {
return **
this; }
106 constexpr operator T &&() && {
return *std::move(*
this); }
107 constexpr operator const T &&()
const&& {
return *std::move(*
this); }
109 template<
typename... Args>
constexpr auto operator()(Args&&... args) &
111 return (**
this)(
static_cast<Args&&
>(args)...);
113 template<
typename... Args>
constexpr auto operator()(Args&&... args)
const&
115 return (**
this)(
static_cast<Args&&
>(args)...);
117 template<
typename... Args>
constexpr auto operator()(Args&&... args) &&
119 return (*std::move(*
this))(
static_cast<Args&&
>(args)...);
121 template<
typename... Args>
constexpr auto operator()(Args&&... args)
const&&
123 return (*std::move(*
this))(
static_cast<Args&&
>(args)...);
129 constexpr semiregular(tag, std::false_type) {}
130 constexpr semiregular(tag, std::true_type)
141 template<
typename Arg, std::enable_if_t<(std::is_constructible_v<
142 std::reference_wrapper<T&>,
144 constexpr semiregular(std::in_place_t, Arg& arg) : std::reference_wrapper<T&>(arg)
148 using std::reference_wrapper<T&>::reference_wrapper;
149 using std::reference_wrapper<T&>::get;
150 using std::reference_wrapper<T&>::operator T&;
151 using std::reference_wrapper<T&>::operator();
158 template<
typename Arg, std::enable_if_t<(std::is_constructible_v<
159 std::reference_wrapper<T&&>,
162 : std::reference_wrapper<T&>(
static_cast<Arg&&
>(arg))
166 using std::reference_wrapper<T&&>::reference_wrapper;
167 using std::reference_wrapper<T&&>::get;
168 using std::reference_wrapper<T&&>::operator T&&;
169 using std::reference_wrapper<T&&>::operator();
176 std::conditional_t<std::is_default_constructible_v<T> &&
177 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_copy_assign()=default
constexpr ~semiregular_move_assign()=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 &&