[expected.unexpected] (original) (raw)

22 General utilities library [utilities]

22.8 Expected objects [expected]

22.8.3 Class template unexpected [expected.unexpected]

22.8.3.1 General [expected.un.general]

Subclause [expected.unexpected] describes the class template unexpectedthat represents unexpected objects stored in expected objects.

namespace std { template<class E> class unexpected { public: constexpr unexpected(const unexpected&) = default;constexpr unexpected(unexpected&&) = default;template<class Err = E> constexpr explicit unexpected(Err&&);template<class... Args> constexpr explicit unexpected(in_place_t, Args&&...);template<class U, class... Args> constexpr explicit unexpected(in_place_t, initializer_list<U>, Args&&...);constexpr unexpected& operator=(const unexpected&) = default;constexpr unexpected& operator=(unexpected&&) = default;constexpr const E& error() const & noexcept;constexpr E& error() & noexcept;constexpr const E&& error() const && noexcept;constexpr E&& error() && noexcept;constexpr void swap(unexpected& other) noexcept(see below);template<class E2> friend constexpr bool operator==(const unexpected&, const unexpected<E2>&);friend constexpr void swap(unexpected& x, unexpected& y) noexcept(noexcept(x.swap(y)));private: E unex; };template<class E> unexpected(E) -> unexpected<E>;}

A program that instantiates the definition of unexpected for a non-object type, an array type, a specialization of unexpected, or a cv-qualified type is ill-formed.

22.8.3.2 Constructors [expected.un.cons]

template<class Err = E> constexpr explicit unexpected(Err&& e);

Constraints:

Effects: Direct-non-list-initializes unex with std​::​forward<Err>(e).

Throws: Any exception thrown by the initialization of unex.

template<class... Args> constexpr explicit unexpected(in_place_t, Args&&... args);

Constraints: is_constructible_v<E, Args...> is true.

Effects: Direct-non-list-initializes_unex_ with std​::​forward<Args>(args)....

Throws: Any exception thrown by the initialization of unex.

template<class U, class... Args> constexpr explicit unexpected(in_place_t, initializer_list<U> il, Args&&... args);

Constraints: is_constructible_v<E, initializer_list<U>&, Args...> is true.

Effects: Direct-non-list-initializes_unex_ with il, std​::​forward<Args>(args)....

Throws: Any exception thrown by the initialization of unex.

22.8.3.3 Observers [expected.un.obs]

constexpr const E& error() const & noexcept;constexpr E& error() & noexcept;

constexpr E&& error() && noexcept;constexpr const E&& error() const && noexcept;

Returns: std​::​move(unex).

22.8.3.4 Swap [expected.un.swap]

constexpr void swap(unexpected& other) noexcept(is_nothrow_swappable_v<E>);

Mandates: is_swappable_v<E> is true.

Effects: Equivalent to:using std​::​swap; swap(unex, other.unex);

friend constexpr void swap(unexpected& x, unexpected& y) noexcept(noexcept(x.swap(y)));

Constraints: is_swappable_v<E> is true.

Effects: Equivalent to x.swap(y).

22.8.3.5 Equality operator [expected.un.eq]

template<class E2> friend constexpr bool operator==(const unexpected& x, const unexpected<E2>& y);

Mandates: The expression x.error() == y.error() is well-formed and its result is convertible to bool.

Returns: x.error() == y.error().