23 General utilities library [utilities]

23.6 Optional objects [optional]

23.6.3 Class template optional [optional.optional]

23.6.3.1 Constructors [optional.ctor]

constexpr optional() noexcept; constexpr optional(nullopt_t) noexcept;

Postconditions: *this does not contain a value.

Remarks: No contained value is initialized. For every object type T these constructors shall be constexpr constructors.

constexpr optional(const optional& rhs);

Effects: If rhs contains a value, initializes the contained value as if direct-non-list-initializing an object of type T with the expression *rhs.

Postconditions: bool(rhs) == bool(*this).

Throws: Any exception thrown by the selected constructor of T.

Remarks: This constructor shall be defined as deleted unless is_­copy_­constructible_­v<T> is true. If is_­trivially_­copy_­constructible_­v<T> is true, this constructor shall be a constexpr constructor.

constexpr optional(optional&& rhs) noexcept(see below);

Effects: If rhs contains a value, initializes the contained value as if direct-non-list-initializing an object of type T with the expression std​::​move(*rhs). bool(rhs) is unchanged.

Postconditions: bool(rhs) == bool(*this).

Throws: Any exception thrown by the selected constructor of T.

Remarks: The expression inside noexcept is equivalent to is_­nothrow_­move_­constructible_­v<T>. This constructor shall not participate in overload resolution unless is_­move_­constructible_­v<T> is true. If is_­trivially_­move_­constructible_­v<T> is true, this constructor shall be a constexpr constructor.

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

Effects: Initializes the contained value as if direct-non-list-initializing an object of type T with the arguments std​::​forward<Args>(args)....

Postconditions: *this contains a value.

Throws: Any exception thrown by the selected constructor of T.

Remarks: If T's constructor selected for the initialization is a constexpr constructor, this constructor shall be a constexpr constructor. This constructor shall not participate in overload resolution unless is_­constructible_­v<T, Args...> is true.

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

Effects: Initializes the contained value as if direct-non-list-initializing an object of type T with the arguments il, std​::​forward<Args>(args)....

Postconditions: *this contains a value.

Throws: Any exception thrown by the selected constructor of T.

Remarks: This constructor shall not participate in overload resolution unless is_­constructible_­v<T, initializer_­list<U>&, Args&&...> is true. If T's constructor selected for the initialization is a constexpr constructor, this constructor shall be a constexpr constructor.

[Note: The following constructors are conditionally specified as explicit. This is typically implemented by declaring two such constructors, of which at most one participates in overload resolution. end note]

template <class U = T> EXPLICIT constexpr optional(U&& v);

Effects: Initializes the contained value as if direct-non-list-initializing an object of type T with the expression std​::​forward<U>(v).

Postconditions: *this contains a value.

Throws: Any exception thrown by the selected constructor of T.

Remarks: If T's selected constructor is a constexpr constructor, this constructor shall be a constexpr constructor. This constructor shall not participate in overload resolution unless is_­constructible_­v<T, U&&> is true, is_­same_­v<decay_­t<U>, in_­place_­t> is false, and is_­same_­v<optional<T>, decay_­t<U>> is false. The constructor is explicit if and only if is_­convertible_­v<U&&, T> is false.

template <class U> EXPLICIT optional(const optional<U>& rhs);

Effects: If rhs contains a value, initializes the contained value as if direct-non-list-initializing an object of type T with the expression *rhs.

Postconditions: bool(rhs) == bool(*this).

Throws: Any exception thrown by the selected constructor of T.

Remarks: This constructor shall not participate in overload resolution unless

  • is_­constructible_­v<T, const U&> is true,

  • is_­constructible_­v<T, optional<U>&> is false,

  • is_­constructible_­v<T, optional<U>&&> is false,

  • is_­constructible_­v<T, const optional<U>&> is false,

  • is_­constructible_­v<T, const optional<U>&&> is false,

  • is_­convertible_­v<optional<U>&, T> is false,

  • is_­convertible_­v<optional<U>&&, T> is false,

  • is_­convertible_­v<const optional<U>&, T> is false, and

  • is_­convertible_­v<const optional<U>&&, T> is false.

The constructor is explicit if and only if is_­convertible_­v<const U&, T> is false.

template <class U> EXPLICIT optional(optional<U>&& rhs);

Effects: If rhs contains a value, initializes the contained value as if direct-non-list-initializing an object of type T with the expression std​::​move(*rhs). bool(rhs) is unchanged.

Postconditions: bool(rhs) == bool(*this).

Throws: Any exception thrown by the selected constructor of T.

Remarks: This constructor shall not participate in overload resolution unless

  • is_­constructible_­v<T, U&&> is true,

  • is_­constructible_­v<T, optional<U>&> is false,

  • is_­constructible_­v<T, optional<U>&&> is false,

  • is_­constructible_­v<T, const optional<U>&> is false,

  • is_­constructible_­v<T, const optional<U>&&> is false,

  • is_­convertible_­v<optional<U>&, T> is false,

  • is_­convertible_­v<optional<U>&&, T> is false,

  • is_­convertible_­v<const optional<U>&, T> is false, and

  • is_­convertible_­v<const optional<U>&&, T> is false.

The constructor is explicit if and only if is_­convertible_­v<U&&, T> is false.