В описаниях , которые следуют, давайтеi быть в диапазоне[0, sizeof...(Types)), иTi бытьith типа вTypes....
constexpr variant() noexcept(see below);
Remarks: Эта функция должна быть вconstexpr том и только в том случае, если инициализация значения альтернативного типаT0 удовлетворяет требованиям для функции constexpr. Выражение внутриnoexcept эквивалентно is_nothrow_default_constructible_v<T0>. Эта функция не будет участвовать в разрешении перегрузки , если is_default_constructible_v<T0> неtrue. [ Note: См. Также классmonostate. ] — end note
variant(const variant& w);
Effects: Еслиw содержит значение, инициализируетvariant для хранения той же альтернативы, чтоw и, и напрямую инициализирует содержащееся значение с помощьюget<j>(w), гдеj isw.index(). В противном случае инициализирует,variant чтобы не хранить значение.
Remarks: Эта функция не должна участвовать в разрешении перегрузки, за исключением случаев, когда она is_copy_constructible_v<Ti> предназначенаtrue для всехi.
variant(variant&& w) noexcept(see below);
Effects: Еслиw содержит значение, инициализируетvariant для хранения той же альтернативы, чтоw и, и напрямую инициализирует содержащееся значение с помощью get<j>(std::move(w)), гдеj isw.index(). В противном случае инициализирует,variant чтобы не хранить значение.
Remarks: Выражение внутриnoexcept эквивалентно логическому И is_nothrow_move_constructible_v<Ti> для всехi. Эта функция не должна участвовать в разрешении перегрузки, за исключением случаев, когда она is_move_constructible_v<Ti> предназначенаtrue для всехi.
template <class T> constexpr variant(T&& t) noexcept(see below);
ПозвольтеTj быть типом, который определяется следующим образом: построить мнимую функциюFUN(Ti) для каждого альтернативного типаTi. Перегрузка,FUN(Tj) выбранная разрешением перегрузки для выражения,FUN(std::forward<T>(t)) определяет альтернативу,Tj которая является типом содержащегося значения после построения.
Effects: Инициализируется*this для хранения альтернативного типаTj и напрямую инициализирует содержащееся в нем значение, как если бы оно было инициализировано напрямую без использования спискаstd::forward<T>(t).
Remarks: Эта функция не будет участвовать в разрешении перегрузки , если только is_same_v<decay_t<T>, variant> не будетfalse, если толькоdecay_t<T> не является ни специализации ,in_place_type_t ни специализацииin_place_index_t, если толькоis_constructible_v<Tj, T> не будетtrue, и если выражение (с того вышеупомянутый набор функций мнимых) хорошо сформированы.FUN(std::forward<T>(t)) FUN
[ Note:
variant<string, string> v("abc");
неправильно сформирован, поскольку оба альтернативных типа имеют одинаково жизнеспособный конструктор для аргумента. ] — end note
Выражение внутриnoexcept эквивалентно is_nothrow_constructible_v<Tj, T>. ЕслиTjвыбранный конструктор является конструктором constexpr, этот конструктор должен быть конструктором constexpr.
template <class T, class... Args> constexpr explicit variant(in_place_type_t<T>, Args&&... args);
Effects: Инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаT с аргументамиstd::forward<Args>(args)....
Remarks: Эта функция не должна участвовать в разрешении перегрузки, если только одно вхождениеT inTypes... и is_constructible_v<T, Args...> istrue. ЕслиTвыбранный конструктор является конструктором constexpr, этот конструктор должен быть конструктором constexpr.
template <class T, class U, class... Args>
constexpr explicit variant(in_place_type_t<T>, initializer_list<U> il, Args&&... args);
Effects: Инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаT с аргументамиil, std::forward<Args>(args)....
Remarks: Эта функция не должна участвовать в разрешении перегрузки, если только одно вхождениеT inTypes... и is_constructible_v<T, initializer_list<U>&, Args...> istrue. ЕслиTвыбранный конструктор является конструктором constexpr, этот конструктор должен быть конструктором constexpr.
template <size_t I, class... Args> constexpr explicit variant(in_place_index_t<I>, Args&&... args);
Effects: Инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаTI с аргументамиstd::forward<Args>(args)....
template <size_t I, class U, class... Args>
constexpr explicit variant(in_place_index_t<I>, initializer_list<U> il, Args&&... args);
Effects: Инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаTI с аргументамиil, std::forward<Args>(args)....
Remarks: Эта функция не должна участвовать в разрешении перегрузки, если только
I меньше чемsizeof...(Types) и
is_constructible_v<TI, initializer_list<U>&, Args...> естьtrue.
ЕслиTIвыбранный конструктор является конструктором constexpr, этот конструктор должен быть конструктором constexpr.
// allocator-extended constructors
template <class Alloc>
variant(allocator_arg_t, const Alloc& a);
template <class Alloc>
variant(allocator_arg_t, const Alloc& a, const variant& v);
template <class Alloc>
variant(allocator_arg_t, const Alloc& a, variant&& v);
template <class Alloc, class T>
variant(allocator_arg_t, const Alloc& a, T&& t);
template <class Alloc, class T, class... Args>
variant(allocator_arg_t, const Alloc& a, in_place_type_t<T>, Args&&... args);
template <class Alloc, class T, class U, class... Args>
variant(allocator_arg_t, const Alloc& a, in_place_type_t<T>,
initializer_list<U> il, Args&&... args);
template <class Alloc, size_t I, class... Args>
variant(allocator_arg_t, const Alloc& a, in_place_index_t<I>, Args&&... args);
template <class Alloc, size_t I, class U, class... Args>
variant(allocator_arg_t, const Alloc& a, in_place_index_t<I>,
initializer_list<U> il, Args&&... args);
Effects: Эквивалентен предыдущим конструкторам, за исключением того, что содержащееся значение создается с помощьюuses-allocator construction.