Files
cppdraft_translate/cppdraft/tuple/cnstr.md
2025-10-25 03:02:53 +03:00

14 KiB
Raw Blame History

[tuple.cnstr]

22 General utilities library [utilities]

22.4 Tuples [tuple]

22.4.4 Class template tuple [tuple.tuple]

22.4.4.2 Construction [tuple.cnstr]

1

#

In the descriptions that follow, let i be in the range [0, sizeof...(Types)) in order, Ti be the ith type in Types, andUi be the ith type in a template parameter pack named UTypes, where indexing is zero-based.

2

#

For each tuple constructor, an exception is thrown only if the construction of one of the types in Types throws an exception.

3

#

The defaulted move and copy constructor, respectively, oftuple is a constexpr function if and only if all required element-wise initializations for move and copy, respectively, would be constexpr-suitable ([dcl.constexpr]).

The defaulted move and copy constructor of tuple<> are constexpr functions.

4

#

If is_trivially_destructible_v is true for all Ti, then the destructor of tuple is trivial.

5

#

The default constructor of tuple<> is trivial.

🔗

constexpr explicit(see below) tuple();

6

#

Constraints: is_default_constructible_v is true for all i.

7

#

Effects: Value-initializes each element.

8

#

Remarks: The expression inside explicit evaluates to true if and only if Ti is not copy-list-initializable from an empty list for at least one i.

[Note 1:

This behavior can be implemented with a trait that checks whether a const Ti& can be initialized with {}.

— end note]

🔗

constexpr explicit(see below) tuple(const Types&...);

9

#

Constraints: sizeof...(Types) ≥ 1 andis_copy_constructible_v is true for all i.

10

#

Effects: Initializes each element with the value of the corresponding parameter.

11

#

Remarks: The expression inside explicit is equivalent to:!conjunction_v<is_convertible<const Types&, Types>...>

🔗

template<class... UTypes> constexpr explicit(see below) tuple(UTypes&&... u);

12

#

Let disambiguating-constraint be:

negation<is_same<remove_cvref_t, tuple>> if sizeof...(Types) is 1;

otherwise,bool_constant<!is_same_v<remove_cvref_t, allocator_arg_t> || is_-
same_v<remove_cvref_t, allocator_arg_t>> if sizeof...(Types) is 2 or 3;

otherwise, true_type.

13

#

Constraints:

sizeof...(Types) equals sizeof...(UTypes),

sizeof...(Types) ≥ 1, and

conjunction_v<disambiguating-constraint, is_constructible<Types, UTypes>...> is
true.

14

#

Effects: Initializes the elements in the tuple with the corresponding value in std::forward(u).

15

#

Remarks: The expression inside explicit is equivalent to:!conjunction_v<is_convertible<UTypes, Types>...>

This constructor is defined as deleted if(reference_constructs_from_temporary_v<Types, UTypes&&> || ...) is true.

🔗

tuple(const tuple& u) = default;

16

#

Mandates: is_copy_constructible_v is true for all i.

17

#

Effects: Initializes each element of *this with the corresponding element of u.

🔗

tuple(tuple&& u) = default;

18

#

Constraints: is_move_constructible_v is true for all i.

19

#

Effects: For all i, initializes the ith element of *this withstd::forward(get(u)).

🔗

template<class... UTypes> constexpr explicit(see below) tuple(tuple<UTypes...>& u); template<class... UTypes> constexpr explicit(see below) tuple(const tuple<UTypes...>& u); template<class... UTypes> constexpr explicit(see below) tuple(tuple<UTypes...>&& u); template<class... UTypes> constexpr explicit(see below) tuple(const tuple<UTypes...>&& u);

20

#

Let I be the pack 0, 1, …, (sizeof...(Types) - 1).

Let FWD(u) be static_cast<decltype(u)>(u).

21

#

Constraints:

sizeof...(Types) equals sizeof...(UTypes), and

(is_constructible_v<Types, decltype(get(FWD(u)))> && ...) is true, and

either sizeof...(Types) is not 1, or (when Types... expands to T andUTypes... expands to U)is_convertible_v<decltype(u), T>,is_constructible_v<T, decltype(u)>, andis_same_v<T, U> are all false.

22

#

Effects: For all i, initializes the ith element of *this with get(FWD(u)).

23

#

Remarks: The expression inside explicit is equivalent to:!(is_convertible_v<decltype(get(FWD(u))), Types> && ...)

The constructor is defined as deleted if(reference_constructs_from_temporary_v<Types, decltype(get(FWD(u)))> || ...) is true.

🔗

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

24

#

Let FWD(u) be static_cast<decltype(u)>(u).

25

#

Constraints:

sizeof...(Types) is 2,

is_constructible_v<T0, decltype(get<0>(FWD(u)))> is true, and

is_constructible_v<T1, decltype(get<1>(FWD(u)))> is true.

26

#

Effects: Initializes the first element with get<0>(FWD(u)) and the second element with get<1>(FWD(u)).

27

#

Remarks: The expression inside explicit is equivalent to:!is_convertible_v<decltype(get<0>(FWD(u))), T0> ||!is_convertible_v<decltype(get<1>(FWD(u))), T1>

The constructor is defined as deleted ifreference_constructs_from_temporary_v<T0, decltype(get<0>(FWD(u)))> || reference_constructs_from_temporary_v<T1, decltype(get<1>(FWD(u)))> is true.

🔗

template<[tuple-like](tuple.like#concept:tuple-like "22.4.3Concept tuple-like[tuple.like]") UTuple> constexpr explicit(see below) tuple(UTuple&& u);

28

#

Let I be the pack 0, 1, …, (sizeof...(Types) - 1).

29

#

Constraints:

different-from<UTuple, tuple> ([range.utility.helpers]) is true,

remove_cvref_t is not a specialization of ranges::subrange,

sizeof...(Types) equals tuple_size_v<remove_cvref_t>,

(is_constructible_v<Types, decltype(get(std::forward(u)))> && ...) istrue, and

either sizeof...(Types) is not 1, or (when Types... expands to T)is_convertible_v<UTuple, T> andis_constructible_v<T, UTuple> are both false.

30

#

Effects: For all i, initializes the ith element of *this withget(std::forward(u)).

31

#

Remarks: The expression inside explicit is equivalent to:!(is_convertible_v<decltype(get(std::forward(u))), Types> && ...)

The constructor is defined as deleted if(reference_constructs_from_temporary_v<Types, decltype(get(std::forward(u)))>|| ...) is true.

🔗

template<class Alloc> constexpr explicit(see below) tuple(allocator_arg_t, const Alloc& a); template<class Alloc> constexpr explicit(see below) tuple(allocator_arg_t, const Alloc& a, const Types&...); template<class Alloc, class... UTypes> constexpr explicit(see below) tuple(allocator_arg_t, const Alloc& a, UTypes&&...); template<class Alloc> constexpr tuple(allocator_arg_t, const Alloc& a, const tuple&); template<class Alloc> constexpr tuple(allocator_arg_t, const Alloc& a, tuple&&); template<class Alloc, class... UTypes> constexpr explicit(see below) tuple(allocator_arg_t, const Alloc& a, tuple<UTypes...>&); template<class Alloc, class... UTypes> constexpr explicit(see below) tuple(allocator_arg_t, const Alloc& a, const tuple<UTypes...>&); template<class Alloc, class... UTypes> constexpr explicit(see below) tuple(allocator_arg_t, const Alloc& a, tuple<UTypes...>&&); template<class Alloc, class... UTypes> constexpr explicit(see below) tuple(allocator_arg_t, const Alloc& a, const tuple<UTypes...>&&); template<class Alloc, class U1, class U2> constexpr explicit(see below) tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&); template<class Alloc, class U1, class U2> constexpr explicit(see below) tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&); template<class Alloc, class U1, class U2> constexpr explicit(see below) tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&&); template<class Alloc, class U1, class U2> constexpr explicit(see below) tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&&); template<class Alloc, [tuple-like](tuple.like#concept:tuple-like "22.4.3Concept tuple-like[tuple.like]") UTuple> constexpr explicit(see below) tuple(allocator_arg_t, const Alloc& a, UTuple&&);

32

#

Preconditions: Alloc meets the Cpp17Allocator requirements ([allocator.requirements.general]).

33

#

Effects: Equivalent to the preceding constructors except that each element is constructed withuses-allocator construction.