[optional.observe] # 22 General utilities library [[utilities]](./#utilities) ## 22.5 Optional objects [[optional]](optional#observe) ### 22.5.3 Class template optional [[optional.optional]](optional.optional#optional.observe) #### 22.5.3.7 Observers [optional.observe] [🔗](#lib:operator-%3e,optional) `constexpr const T* operator->() const noexcept; constexpr T* operator->() noexcept; ` [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4111) *Hardened preconditions*: has_value() is true[.](#1.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4115) *Returns*: val[.](#2.sentence-1) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4119) *Remarks*: These functions are constexpr functions[.](#3.sentence-1) [🔗](#lib:operator*,optional) `constexpr const T& operator*() const & noexcept; constexpr T& operator*() & noexcept; ` [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4131) *Hardened preconditions*: has_value() is true[.](#4.sentence-1) [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4135) *Returns*: *val[.](#5.sentence-1) [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4139) *Remarks*: These functions are constexpr functions[.](#6.sentence-1) [🔗](#lib:operator*,optional_) `constexpr T&& operator*() && noexcept; constexpr const T&& operator*() const && noexcept; ` [7](#7) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4151) *Hardened preconditions*: has_value() is true[.](#7.sentence-1) [8](#8) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4155) *Effects*: Equivalent to: return std​::​move(*val); [🔗](#lib:operator_bool,optional) `constexpr explicit operator bool() const noexcept; ` [9](#9) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4166) *Returns*: true if and only if *this contains a value[.](#9.sentence-1) [10](#10) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4170) *Remarks*: This function is a constexpr function[.](#10.sentence-1) [🔗](#lib:has_value,optional) `constexpr bool has_value() const noexcept; ` [11](#11) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4181) *Returns*: true if and only if *this contains a value[.](#11.sentence-1) [12](#12) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4185) *Remarks*: This function is a constexpr function[.](#12.sentence-1) [🔗](#lib:value,optional) `constexpr const T& value() const &; constexpr T& value() &; ` [13](#13) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4197) *Effects*: Equivalent to:return has_value() ? *val : throw bad_optional_access(); [🔗](#lib:value,optional_) `constexpr T&& value() &&; constexpr const T&& value() const &&; ` [14](#14) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4213) *Effects*: Equivalent to:return has_value() ? std::move(*val) : throw bad_optional_access(); [🔗](#lib:value_or,optional) `template> constexpr T value_or(U&& v) const &; ` [15](#15) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4227) *Mandates*: is_copy_constructible_v && is_convertible_v is true[.](#15.sentence-1) [16](#16) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4231) *Effects*: Equivalent to:return has_value() ? **this : static_cast(std::forward(v)); [🔗](#lib:value_or,optional_) `template> constexpr T value_or(U&& v) &&; ` [17](#17) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4245) *Mandates*: is_move_constructible_v && is_convertible_v is true[.](#17.sentence-1) [18](#18) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L4249) *Effects*: Equivalent to:return has_value() ? std::move(**this) : static_cast(std::forward(v));