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 не содержит значения.

Remarks: Никакое содержащееся значение не инициализируется. Для каждого типа объектаT эти конструкторы должны быть constexpr constructors.

constexpr optional(const optional& rhs);

Effects: Еслиrhs содержит значение, инициализирует содержащееся значение, как если бы инициализирует объект типаT выражением напрямую без использования списка*rhs.

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

Throws: Любое исключение, созданное выбранным конструкторомT.

Remarks: Этот конструктор должен быть определен как удален , если is_­copy_­constructible_­v<T> неtrue. Еслиis_­trivially_­copy_­constructible_­v<T> естьtrue, этот конструктор должен бытьconstexpr конструктором.

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

Effects: Еслиrhs содержит значение, инициализирует содержащееся значение, как если бы инициализирует объект типаT выражением напрямую без использования спискаstd​::​move(*rhs). bool(rhs) без изменений.

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

Throws: Любое исключение, созданное выбранным конструкторомT.

Remarks: Выражение внутриnoexcept эквивалентно is_­nothrow_­move_­constructible_­v<T>. Этот конструктор не должен участвовать в разрешении перегрузки , еслиis_­move_­constructible_­v<T> неtrue. Еслиis_­trivially_­move_­constructible_­v<T> естьtrue, этот конструктор должен бытьconstexpr конструктором.

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

Effects: Инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаT с аргументамиstd​::​forward<Args>(args)....

Postconditions: *this содержит значение.

Throws: Любое исключение, созданное выбранным конструкторомT.

Remarks: ЕслиTконструктор, выбранный для инициализации, является конструктором constexpr, этот конструктор должен быть конструктором constexpr. Этот конструктор не должен участвовать в разрешении перегрузки , еслиis_­constructible_­v<T, Args...> неtrue.

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

Effects: Инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаT с аргументамиil, std​::​forward<Args>(args)....

Postconditions: *this содержит значение.

Throws: Любое исключение, созданное выбранным конструкторомT.

Remarks: Этот конструктор не должен участвовать в разрешении перегрузки , еслиis_­constructible_­v<T, initializer_­list<U>&, Args&&...> неtrue. ЕслиTконструктор, выбранный для инициализации, является конструктором constexpr, этот конструктор должен быть конструктором constexpr.

[ Note: Следующие конструкторы условно указаны как явные. Обычно это реализуется путем объявления двух таких конструкторов, максимум один из которых участвует в разрешении перегрузки. ]end note

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

Effects: Инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую, не являясь списком,T с выражениемstd​::​forward<U>(v).

Postconditions: *this содержит значение.

Throws: Любое исключение, созданное выбранным конструкторомT.

Remarks: ЕслиTвыбранный конструктор является конструктором constexpr, этот конструктор должен быть конструктором constexpr. Этот конструктор не должен участвовать в разрешении перегрузки, за исключением случаев, когда is_­constructible_­v<T, U&&> естьtrue, is_­same_­v<decay_­t<U>, in_­place_­t> естьfalseи is_­same_­v<optional<T>, decay_­t<U>> естьfalse. Конструктор является явным тогда и только тогда, когда он is_­convertible_­v<U&&, T> естьfalse.

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

Effects: Еслиrhs содержит значение, инициализирует содержащееся значение, как если бы инициализирует объект типаT выражением напрямую без использования списка*rhs.

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

Throws: Любое исключение, созданное выбранным конструкторомT.

Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, если только

  • is_­constructible_­v<T, const U&> естьtrue,

  • is_­constructible_­v<T, optional<U>&> естьfalse,

  • is_­constructible_­v<T, optional<U>&&> естьfalse,

  • is_­constructible_­v<T, const optional<U>&> естьfalse,

  • is_­constructible_­v<T, const optional<U>&&> естьfalse,

  • is_­convertible_­v<optional<U>&, T> естьfalse,

  • is_­convertible_­v<optional<U>&&, T> естьfalse,

  • is_­convertible_­v<const optional<U>&, T> естьfalse, и

  • is_­convertible_­v<const optional<U>&&, T> естьfalse.

Конструктор является явным тогда и только тогда, когда он is_­convertible_­v<const U&, T> естьfalse.

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

Effects: Еслиrhs содержит значение, инициализирует содержащееся значение, как если бы инициализирует объект типаT выражением напрямую без использования спискаstd​::​move(*rhs). bool(rhs) без изменений.

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

Throws: Любое исключение, созданное выбранным конструкторомT.

Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, если только

  • is_­constructible_­v<T, U&&> правда,

  • is_­constructible_­v<T, optional<U>&> естьfalse,

  • is_­constructible_­v<T, optional<U>&&> естьfalse,

  • is_­constructible_­v<T, const optional<U>&> естьfalse,

  • is_­constructible_­v<T, const optional<U>&&> естьfalse,

  • is_­convertible_­v<optional<U>&, T> естьfalse,

  • is_­convertible_­v<optional<U>&&, T> естьfalse,

  • is_­convertible_­v<const optional<U>&, T> естьfalse, и

  • is_­convertible_­v<const optional<U>&&, T> естьfalse.

Конструктор является явным тогда и только тогда, когда он is_­convertible_­v<U&&, T> естьfalse.