23 General utilities library [utilities]

23.5 Tuples [tuple]

23.5.3 Class template tuple [tuple.tuple]

23.5.3.1 Construction [tuple.cnstr]

Для каждогоtuple конструктора создается исключение, только если конструкция одного из типов вTypes вызывает исключение.

Конструктор перемещения и копирования по умолчанию, соответственно, tuple должен быть функцией constexpr тогда и только тогда, когда все требуемые поэлементные инициализации для копирования и перемещения, соответственно, будут удовлетворять требованиям для функции constexpr. Конструктор перемещения и копирования по умолчаниюtuple<> должен быть функциями constexpr.

Деструктор кортежа должен быть тривиальным деструктором, если (is_­trivially_­destructible_­v<Types> && ...) естьtrue.

В нижеследующих описаниях конструктора пустьi будет в диапазоне [0, sizeof...(Types)) по порядку,Ti будетith типом вTypesи Ui будетith типом в названном пакете параметров шаблонаUTypes, где индексирование отсчитывается от нуля.

EXPLICIT constexpr tuple();

Effects: Значение инициализирует каждый элемент.

Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, кроме случаев, когда он is_­default_­constructible_­v<Ti> предназначенtrue для всехi. [ Note: Это поведение может быть реализовано с помощью шаблона конструктора с аргументами шаблона по умолчанию. ] Конструктор является явным тогда и только тогда, когда он не может быть неявно сконструирован по умолчанию хотя бы для одного . [ Это поведение может быть реализовано с помощью трейта, который проверяет, можно ли инициализировать с помощью . ] end noteTi iNote: const Ti& {}end note

EXPLICIT constexpr tuple(const Types&...);

Effects: Инициализирует каждый элемент значением соответствующего параметра.

Remarks: Этот конструктор не должен участвовать в разрешении перегрузки , если sizeof...(Types) >= 1 иis_­copy_­constructible_­v<Ti> неtrue для всехi. Конструктор является явным тогда и только тогда, когда is_­convertible_­v<const Ti&, Ti> онfalse предназначен хотя бы для одногоi.

template <class... UTypes> EXPLICIT constexpr tuple(UTypes&&... u);

Effects: Инициализирует элементы в кортеже с соответствующим значением вstd​::​forward<UTypes>(u).

Remarks: Этот конструктор не должен участвовать в разрешении перегрузки , если sizeof...(Types)==sizeof...(UTypes) и sizeof...(Types) >= 1 иis_­constructible_­v<Ti, Ui&&> являетсяtrue для всехi. Конструктор является явным тогда и только тогда, когда is_­convertible_­v<Ui&&, Ti> онfalse предназначен хотя бы для одногоi.

tuple(const tuple& u) = default;

Requires:is_­copy_­constructible_­v<Ti> этоtrue для всехi.

Effects: Инициализирует каждый элемент*this соответствующего элементаu.

tuple(tuple&& u) = default;

Requires:is_­move_­constructible_­v<Ti> этоtrue для всехi.

Effects: Для всехiинициализируетith элемент*this with std​::​forward<Ti>(get<i>(u)).

template <class... UTypes> EXPLICIT constexpr tuple(const tuple<UTypes...>& u);

Effects: Инициализирует каждый элемент*this соответствующего элементаu.

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

  • sizeof...(Types)==sizeof...(UTypes) а также

  • is_­constructible_­v<Ti, const Ui&> этоtrue для всехi, и

  • sizeof...(Types) != 1, или (когдаTypes... расширяется доT иUTypes... расширяется доU)
    !is_­convertible_­v<const tuple<U>&, T> && !is_­constructible_­v<T, const tuple<U>&>
    && !is_­same_­v<T, U>
    равноtrue.

Конструктор является явным тогда и только тогда, когда is_­convertible_­v<const Ui&, Ti> онfalse предназначен хотя бы для одногоi.

template <class... UTypes> EXPLICIT constexpr tuple(tuple<UTypes...>&& u);

Effects: Для всехiинициализируетith элемент*this with std​::​forward<Ui>(get<i>(u)).

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

  • sizeof...(Types)==sizeof...(UTypes), а также

  • is_­constructible_­v<Ti, Ui&&> этоtrue для всехi, и

  • sizeof...(Types) != 1, или (когдаTypes... расширяется доT иUTypes... расширяется доU)
    !is_­convertible_­v<tuple<U>, T> && !is_­constructible_­v<T, tuple<U>> &&
    !is_­same_­v<T, U>
    равноtrue.

Конструктор является явным тогда и только тогда, когда is_­convertible_­v<Ui&&, Ti> онfalse предназначен хотя бы для одногоi.

template <class U1, class U2> EXPLICIT constexpr tuple(const pair<U1, U2>& u);

Effects: Инициализирует первый элемент с помощью,u.first а второй элемент с помощьюu.second.

Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, за исключением случаев sizeof...(Types) == 2, когда is_­constructible_­v<T0, const U1&> естьtrue и is_­constructible_­v<T1, const U2&> естьtrue.

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

template <class U1, class U2> EXPLICIT constexpr tuple(pair<U1, U2>&& u);

Effects: Инициализирует первый элемент с помощью, std​::​forward<U1>(u.first) а второй элемент с помощьюstd​::​forward<U2>(u.second).

Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, за исключением случаев sizeof...(Types) == 2, когда is_­constructible_­v<T0, U1&&> естьtrue и is_­constructible_­v<T1, U2&&> естьtrue.

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

template <class Alloc> tuple(allocator_arg_t, const Alloc& a); template <class Alloc> EXPLICIT tuple(allocator_arg_t, const Alloc& a, const Types&...); template <class Alloc, class... UTypes> EXPLICIT tuple(allocator_arg_t, const Alloc& a, UTypes&&...); template <class Alloc> tuple(allocator_arg_t, const Alloc& a, const tuple&); template <class Alloc> tuple(allocator_arg_t, const Alloc& a, tuple&&); template <class Alloc, class... UTypes> EXPLICIT tuple(allocator_arg_t, const Alloc& a, const tuple<UTypes...>&); template <class Alloc, class... UTypes> EXPLICIT tuple(allocator_arg_t, const Alloc& a, tuple<UTypes...>&&); template <class Alloc, class U1, class U2> EXPLICIT tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&); template <class Alloc, class U1, class U2> EXPLICIT tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&&);

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

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