22 General utilities library [utilities]

22.5 Optional objects [optional]

22.5.4 Partial specialization of optional for reference types [optional.optional.ref]

22.5.4.1 General [optional.optional.ref.general]

namespace std { template<class T> class optional<T&> { public: using value_type = T; using iterator = implementation-defined; / present only if T is an object type other than an array / of unknown bound; see [optional.ref.iterators] public: / [optional.ref.ctor], constructors constexpr optional() noexcept = default; constexpr optional(nullopt_t) noexcept : optional() {} constexpr optional(const optional& rhs) noexcept = default; template<class Arg> constexpr explicit optional(in_place_t, Arg&& arg); template<class U> constexpr explicit(see below) optional(U&& u) noexcept(see below); template<class U> constexpr explicit(see below) optional(optional<U>& rhs) noexcept(see below); template<class U> constexpr explicit(see below) optional(const optional<U>& rhs) noexcept(see below); template<class U> constexpr explicit(see below) optional(optional<U>& rhs) noexcept(see below); template<class U> constexpr explicit(see below) optional(const optional<U>& rhs) noexcept(see below); constexpr ~optional() = default; / [optional.ref.assign], assignment constexpr optional& operator=(nullopt_t) noexcept; constexpr optional& operator=(const optional& rhs) noexcept = default; template<class U> constexpr T& emplace(U&& u) noexcept(see below); / [optional.ref.swap], swap constexpr void swap(optional& rhs) noexcept; / [optional.ref.iterators], iterator support constexpr auto begin() const noexcept; constexpr auto end() const noexcept; / [optional.ref.observe], observers constexpr T* operator->() const noexcept; constexpr T& operator*() const noexcept; constexpr explicit operator bool() const noexcept; constexpr bool has_value() const noexcept; constexpr T& value() const; / freestanding-deleted template<class U = remove_cv_t<T>> constexpr remove_cv_t<T> value_or(U&& u) const; / [optional.ref.monadic], monadic operations template<class F> constexpr auto and_then(F&& f) const; template<class F> constexpr optional<invoke_result_t<F, T&> transform(F&& f) const; template<class F> constexpr optional or_else(F&& f) const; / [optional.ref.mod], modifiers constexpr void reset() noexcept; private: T* val = nullptr; / exposition only / [optional.ref.expos], exposition only helper functions template<class U> constexpr void convert-ref-init-val(U&& u); / exposition only }; }
An object of type optional<T&> contains a value if and only if val != nullptr is true.
When an optional<T&> contains a value, the contained value is a reference to *val.
Each type optional<T&> is a trivially copyable class ([class.prop]).

Follow Lee on X/Twitter - Father, Husband, Serial builder creating AI, crypto, games & web tools. We are friends :) AI Will Come To Life!

Check out: eBank.nz (Art Generator) | Netwrck.com (AI Tools) | Text-Generator.io (AI API) | BitBank.nz (Crypto AI) | ReadingTime (Kids Reading) | RewordGame | BigMultiplayerChess | WebFiddle | How.nz | Helix AI Assistant