99 operator T&() {
return value_; }
100 operator const T&()
const {
return value_; }
101 auto operator->()
const {
return value_.operator->(); }
102 auto operator->() {
return value_.operator->(); }
103 auto& operator*()
const {
return value_.operator*(); }
104 auto& operator*() {
return value_.operator*(); }
106 bool operator!()
const {
return !value_; }
107 explicit operator bool()
const {
return static_cast<bool>(value_); }
109#if __cpp_impl_three_way_comparison
110 auto operator<=>(
const Self& other)
const =
default;
117#if !__cpp_impl_three_way_comparison
119template <
typename T>
bool operator==(
const Self<T>& a,
const Self<T>& b) {
return a.reference() == b.reference(); }
120template <
typename T>
bool operator!=(
const Self<T>& a,
const Self<T>& b) {
return a.reference() != b.reference(); }
121template <
typename T>
bool operator<(
const Self<T>& a,
const Self<T>& b) {
return a.reference() < b.reference(); }
122template <
typename T>
bool operator>(
const Self<T>& a,
const Self<T>& b) {
return a.reference() > b.reference(); }
123template <
typename T>
bool operator<=(
const Self<T>& a,
const Self<T>& b) {
return a.reference() <= b.reference(); }
124template <
typename T>
bool operator>=(
const Self<T>& a,
const Self<T>& b) {
return a.reference() >= b.reference(); }
125template <
typename T>
bool operator==(
const Self<T>& a, std::nullptr_t b) {
return a.reference() == b; }
126template <
typename T>
bool operator!=(
const Self<T>& a, std::nullptr_t b) {
return a.reference() != b; }
127template <
typename T>
bool operator==(std::nullptr_t a,
const Self<T>& b) {
return a == b.reference(); }
128template <
typename T>
bool operator!=(std::nullptr_t a,
const Self<T>& b) {
return a != b.reference(); }