23 General utilities library [utilities]

23.7 Variants [variant]

23.7.3 Class template variant [variant.variant]

23.7.3.1 Constructors [variant.ctor]

В описаниях , которые следуют, давайтеi быть в диапазоне[0, sizeof...(Types)), иTi бытьith типа вTypes....

constexpr variant() noexcept(see below);

Effects: Создаетvariant удерживающее значение типа, инициализированное значениемT0.

Postconditions: valueless_­by_­exception() естьfalse иindex() есть0.

Throws: Любое исключение, вызванное инициализацией значенияT0.

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 чтобы не хранить значение.

Throws: Любое исключение, вызванное прямой инициализацией anyTi for alli.

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 чтобы не хранить значение.

Throws: Любое исключение, создаваемое перемещением любогоTi для всехi.

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).

Postconditions: holds_­alternative<Tj>(*this) естьtrue.

Throws: Любое исключение, вызванное инициализацией выбранной альтернативыTj.

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)....

Postconditions: holds_­alternative<T>(*this) естьtrue.

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

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)....

Postconditions: holds_­alternative<T>(*this) естьtrue.

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

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)....

Postconditions: index() естьI.

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

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

  • I меньше чемsizeof...(Types) и

  • is_­constructible_­v<TI, Args...> естьtrue.

ЕслиTIвыбранный конструктор является конструктором constexpr, этот конструктор должен быть конструктором constexpr.

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)....

Postconditions: index() естьI.

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);

Requires: Alloc должны соответствовать требованиям дляAllocator.

Effects: Эквивалентен предыдущим конструкторам, за исключением того, что содержащееся значение создается с помощьюuses-allocator construction.