Для каждого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();
Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, кроме случаев, когда он is_default_constructible_v<Ti> предназначенtrue для всехi. [ Note: Это поведение может быть реализовано с помощью шаблона конструктора с аргументами шаблона по умолчанию. ] Конструктор является явным тогда и только тогда, когда он не может быть неявно сконструирован по умолчанию хотя бы для одного . [ Это поведение может быть реализовано с помощью трейта, который проверяет, можно ли инициализировать с помощью . ] — end note Ti i Note: const Ti& {} — end note
EXPLICIT constexpr tuple(const Types&...);
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;
tuple(tuple&& u) = default;
template <class... UTypes> EXPLICIT constexpr tuple(const tuple<UTypes...>& 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);
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);
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>&&);
Effects: Эквивалентен предыдущим конструкторам, за исключением того, что каждый элемент построен с использованием uses-allocator construction.