constexpr optional() noexcept;
constexpr optional(nullopt_t) noexcept;
Remarks: Никакое содержащееся значение не инициализируется. Для каждого типа объектаT эти конструкторы должны быть constexpr constructors.
constexpr optional(const optional& rhs);
Effects: Еслиrhs содержит значение, инициализирует содержащееся значение, как если бы инициализирует объект типаT выражением напрямую без использования списка*rhs.
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) без изменений.
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)....
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)....
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).
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.
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) без изменений.
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.