Standard library header  (C++17) (original) (raw)

This header is part of the general utility library.

[edit] Synopsis

// mostly freestanding #include   namespace std { // class template optional template class optional; // partially freestanding   template constexpr bool ranges::enable_view<optional> = true; template constexpr auto format_kind<optional> = range_format::disabled;   template concept /is-derived-from-optional/ = requires(const T& t) { // exposition-only [](const optional&) {}(t); };   // no-value state indicator struct nullopt_t { /* see description / }; inline constexpr nullopt_t nullopt(/ unspecified /);   // class bad_optional_access class bad_optional_access;   // relational operators template<class T, class U> constexpr bool operator==(const optional&, const optional&); template<class T, class U> constexpr bool operator!=(const optional&, const optional&); template<class T, class U> constexpr bool operator<(const optional&, const optional&); template<class T, class U> constexpr bool operator>(const optional&, const optional&); template<class T, class U> constexpr bool operator<=(const optional&, const optional&); template<class T, class U> constexpr bool operator>=(const optional&, const optional&); template<class T, three_way_comparable_with U> constexpr compare_three_way_result_t<T, U> operator<=>(const optional&, const optional&);   // comparison with nullopt template constexpr bool operator==(const optional&, nullopt_t) noexcept; template constexpr strong_ordering operator<=>(const optional&, nullopt_t) noexcept;   // comparison with T template<class T, class U> constexpr bool operator==(const optional&, const U&); template<class T, class U> constexpr bool operator==(const T&, const optional&); template<class T, class U> constexpr bool operator!=(const optional&, const U&); template<class T, class U> constexpr bool operator!=(const T&, const optional&); template<class T, class U> constexpr bool operator<(const optional&, const U&); template<class T, class U> constexpr bool operator<(const T&, const optional&); template<class T, class U> constexpr bool operator>(const optional&, const U&); template<class T, class U> constexpr bool operator>(const T&, const optional&); template<class T, class U> constexpr bool operator<=(const optional&, const U&); template<class T, class U> constexpr bool operator<=(const T&, const optional&); template<class T, class U> constexpr bool operator>=(const optional&, const U&); template<class T, class U> constexpr bool operator>=(const T&, const optional&); template<class T, class U> requires(!/is-derived-from-optional/) && three_way_comparable_with<T, U> constexpr compare_three_way_result_t<T, U> operator<=>(const optional&, const U&);   // specialized algorithms template constexpr void swap(optional&, optional&) noexcept(/ see description */);   template constexpr optional<decay_t> make_optional(T&&); template<class T, class... Args> constexpr optional make_optional(Args&&... args); template<class T, class U, class... Args> constexpr optional make_optional(initializer_list il, Args&&... args);   // hash support template struct hash; template struct hash<optional>; }

[edit] Class template std::optional

namespace std { template class optional { public: using value_type = T; using iterator = /* implementation-defined /; using const_iterator = / implementation-defined /;   // constructors constexpr optional() noexcept; constexpr optional(nullopt_t) noexcept; constexpr optional(const optional&); constexpr optional(optional&&) noexcept(/ see description /); template<class... Args> constexpr explicit optional(in_place_t, Args&&...); template<class U, class... Args> constexpr explicit optional(in_place_t, initializer_list, Args&&...); template<class U = remove_cv_t> constexpr explicit(/ see description /) optional(U&&); template constexpr explicit(/ see description /) optional(const optional&); template constexpr explicit(/ see description /) optional(optional&&);   // destructor constexpr ~optional();   // assignment constexpr optional& operator=(nullopt_t) noexcept; constexpr optional& operator=(const optional&); constexpr optional& operator=(optional&&) noexcept(/ see description /); template<class U = remove_cv_t> constexpr optional& operator=(U&&); template constexpr optional& operator=(const optional&); template constexpr optional& operator=(optional&&); template<class... Args> constexpr T& emplace(Args&&...); template<class U, class... Args> constexpr T& emplace(initializer_list, Args&&...);   // swap constexpr void swap(optional&) noexcept(/ see description /);   // iterator support constexpr iterator begin() noexcept; constexpr const_iterator begin() const noexcept; constexpr iterator end() noexcept; constexpr const_iterator end() const noexcept;   // observers constexpr const T operator->() const noexcept; constexpr T* operator->() noexcept; constexpr const T& operator*() const& noexcept; constexpr T& operator*() & noexcept; constexpr T&& operator*() && noexcept; constexpr const T&& operator*() const&& noexcept; constexpr explicit operator bool() const noexcept; constexpr bool has_value() const noexcept; constexpr const T& value() const&; // freestanding-deleted constexpr T& value() &; // freestanding-deleted constexpr T&& value() &&; // freestanding-deleted constexpr const T&& value() const&&; // freestanding-deleted template<class U = remove_cv_t> constexpr T value_or(U&&) const&; template<class U = remove_cv_t> constexpr T value_or(U&&) &&;   // monadic operations template constexpr auto and_then(F&& f) &; template constexpr auto and_then(F&& f) &&; template constexpr auto and_then(F&& f) const&; template constexpr auto and_then(F&& f) const&&; template constexpr auto transform(F&& f) &; template constexpr auto transform(F&& f) &&; template constexpr auto transform(F&& f) const&; template constexpr auto transform(F&& f) const&&; template constexpr optional or_else(F&& f) &&; template constexpr optional or_else(F&& f) const&;   // modifiers constexpr void reset() noexcept;   private: T* val; // exposition-only };   template optional(T) -> optional; }

[edit] Class template std::bad_optional_access

namespace std { class bad_optional_access : public exception { public: // for the specification of the special member functions constexpr const char* what() const noexcept override; }; }