34 template <
typename U = T>
35 requires(!std::same_as<std::decay_t<U>, Required> && std::constructible_from<T, U &&>)
37 : value_(std::forward<U>(value))
41 template <
typename... Args>
42 requires(
sizeof...(Args) >= 2 && std::constructible_from<T, Args && ...>)
44 : value_(std::forward<Args>(args)...)
47 Required(
const Required&) =
default;
48 Required& operator=(
const Required&) =
default;
49 Required(Required&&) =
default;
50 Required& operator=(Required&&) =
default;
53 constexpr T&
operator*() &
noexcept USERVER_IMPL_LIFETIME_BOUND {
return value_; }
56 constexpr const T&
operator*()
const&
noexcept USERVER_IMPL_LIFETIME_BOUND {
return value_; }
59 constexpr T&&
operator*() &&
noexcept {
return std::move(value_); }
62 constexpr T*
operator->()
noexcept USERVER_IMPL_LIFETIME_BOUND {
return &value_; }
65 constexpr const T*
operator->()
const noexcept USERVER_IMPL_LIFETIME_BOUND {
return &value_; }
68 constexpr operator T&() &
noexcept USERVER_IMPL_LIFETIME_BOUND {
return value_; }
71 constexpr operator const T&()
const&
noexcept USERVER_IMPL_LIFETIME_BOUND {
return value_; }
75 requires(!std::same_as<U, T> && !std::is_reference_v<U> && std::convertible_to<
const T&, U>)