477 lines
13 KiB
Markdown
477 lines
13 KiB
Markdown
[tuple.assign]
|
||
|
||
# 22 General utilities library [[utilities]](./#utilities)
|
||
|
||
## 22.4 Tuples [[tuple]](tuple#assign)
|
||
|
||
### 22.4.4 Class template tuple [[tuple.tuple]](tuple.tuple#tuple.assign)
|
||
|
||
#### 22.4.4.3 Assignment [tuple.assign]
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2152)
|
||
|
||
For each tuple assignment operator, an exception is thrown only if the
|
||
assignment of one of the types in Types throws an exception[.](#1.sentence-1)
|
||
|
||
In the function descriptions that follow, let i be in the range [0, sizeof...(Types))
|
||
in order, Ti be the ith type in Types,
|
||
and Ui be the ith type in a
|
||
template parameter pack named UTypes, where indexing is zero-based[.](#1.sentence-2)
|
||
|
||
[ð](#lib:operator=,tuple)
|
||
|
||
`constexpr tuple& operator=(const tuple& u);
|
||
`
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2166)
|
||
|
||
*Effects*: Assigns each element of u to the corresponding
|
||
element of *this[.](#2.sentence-1)
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2171)
|
||
|
||
*Returns*: *this[.](#3.sentence-1)
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2175)
|
||
|
||
*Remarks*: This operator is defined as deleted unlessis_copy_assignable_v<Ti> is true for all i[.](#4.sentence-1)
|
||
|
||
[ð](#lib:operator=,tuple_)
|
||
|
||
`constexpr const tuple& operator=(const tuple& u) const;
|
||
`
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2187)
|
||
|
||
*Constraints*: (is_copy_assignable_v<const Types> && ...) is true[.](#5.sentence-1)
|
||
|
||
[6](#6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2191)
|
||
|
||
*Effects*: Assigns each element of u to the corresponding element of *this[.](#6.sentence-1)
|
||
|
||
[7](#7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2195)
|
||
|
||
*Returns*: *this[.](#7.sentence-1)
|
||
|
||
[ð](#lib:operator=,tuple__)
|
||
|
||
`constexpr tuple& operator=(tuple&& u) noexcept(see below);
|
||
`
|
||
|
||
[8](#8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2206)
|
||
|
||
*Constraints*: is_move_assignable_v<Ti> is true for all i[.](#8.sentence-1)
|
||
|
||
[9](#9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2210)
|
||
|
||
*Effects*: For all i, assigns std::forward<Ti>(get<i>(u)) toget<i>(*this)[.](#9.sentence-1)
|
||
|
||
[10](#10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2215)
|
||
|
||
*Returns*: *this[.](#10.sentence-1)
|
||
|
||
[11](#11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2219)
|
||
|
||
*Remarks*: The exception specification is equivalent to the logical and of the
|
||
following expressions:is_nothrow_move_assignable_v<Ti> where Ti is the ith type in Types[.](#11.sentence-1)
|
||
|
||
[ð](#lib:operator=,tuple___)
|
||
|
||
`constexpr const tuple& operator=(tuple&& u) const;
|
||
`
|
||
|
||
[12](#12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2235)
|
||
|
||
*Constraints*: (is_assignable_v<const Types&, Types> && ...) is true[.](#12.sentence-1)
|
||
|
||
[13](#13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2239)
|
||
|
||
*Effects*: For all i,
|
||
assigns std::forward<Ti>(get<i>(u)) to get<i>(*this)[.](#13.sentence-1)
|
||
|
||
[14](#14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2244)
|
||
|
||
*Returns*: *this[.](#14.sentence-1)
|
||
|
||
[ð](#lib:operator=,tuple____)
|
||
|
||
`template<class... UTypes> constexpr tuple& operator=(const tuple<UTypes...>& u);
|
||
`
|
||
|
||
[15](#15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2255)
|
||
|
||
*Constraints*:
|
||
|
||
- [(15.1)](#15.1)
|
||
|
||
sizeof...(Types) equals sizeof...(UTypes) and
|
||
|
||
- [(15.2)](#15.2)
|
||
|
||
is_assignable_v<Ti&, const Ui&> is true for all i[.](#15.sentence-1)
|
||
|
||
[16](#16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2262)
|
||
|
||
*Effects*: Assigns each element of u to the corresponding element
|
||
of *this[.](#16.sentence-1)
|
||
|
||
[17](#17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2267)
|
||
|
||
*Returns*: *this[.](#17.sentence-1)
|
||
|
||
[ð](#lib:operator=,tuple_____)
|
||
|
||
`template<class... UTypes> constexpr const tuple& operator=(const tuple<UTypes...>& u) const;
|
||
`
|
||
|
||
[18](#18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2278)
|
||
|
||
*Constraints*:
|
||
|
||
- [(18.1)](#18.1)
|
||
|
||
sizeof...(Types) equals sizeof...(UTypes) and
|
||
|
||
- [(18.2)](#18.2)
|
||
|
||
(is_assignable_v<const Types&, const UTypes&> && ...) is true[.](#18.sentence-1)
|
||
|
||
[19](#19)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2287)
|
||
|
||
*Effects*: Assigns each element of u to the corresponding element of *this[.](#19.sentence-1)
|
||
|
||
[20](#20)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2291)
|
||
|
||
*Returns*: *this[.](#20.sentence-1)
|
||
|
||
[ð](#lib:operator=,tuple______)
|
||
|
||
`template<class... UTypes> constexpr tuple& operator=(tuple<UTypes...>&& u);
|
||
`
|
||
|
||
[21](#21)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2302)
|
||
|
||
*Constraints*:
|
||
|
||
- [(21.1)](#21.1)
|
||
|
||
sizeof...(Types) equals sizeof...(UTypes) and
|
||
|
||
- [(21.2)](#21.2)
|
||
|
||
is_assignable_v<Ti&, Ui> is true for all i[.](#21.sentence-1)
|
||
|
||
[22](#22)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2309)
|
||
|
||
*Effects*: For all i, assigns std::forward<Ui>(get<i>(u)) toget<i>(*this)[.](#22.sentence-1)
|
||
|
||
[23](#23)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2314)
|
||
|
||
*Returns*: *this[.](#23.sentence-1)
|
||
|
||
[ð](#lib:operator=,tuple_______)
|
||
|
||
`template<class... UTypes> constexpr const tuple& operator=(tuple<UTypes...>&& u) const;
|
||
`
|
||
|
||
[24](#24)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2325)
|
||
|
||
*Constraints*:
|
||
|
||
- [(24.1)](#24.1)
|
||
|
||
sizeof...(Types) equals sizeof...(UTypes) and
|
||
|
||
- [(24.2)](#24.2)
|
||
|
||
(is_assignable_v<const Types&, UTypes> && ...) is true[.](#24.sentence-1)
|
||
|
||
[25](#25)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2334)
|
||
|
||
*Effects*: For all i,
|
||
assigns std::forward<Ui>(get<i>(u)) to get<i>(*this)[.](#25.sentence-1)
|
||
|
||
[26](#26)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2339)
|
||
|
||
*Returns*: *this[.](#26.sentence-1)
|
||
|
||
[ð](#lib:operator=,tuple________)
|
||
|
||
`template<class U1, class U2> constexpr tuple& operator=(const pair<U1, U2>& u);
|
||
`
|
||
|
||
[27](#27)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2351)
|
||
|
||
*Constraints*:
|
||
|
||
- [(27.1)](#27.1)
|
||
|
||
sizeof...(Types) is 2 and
|
||
|
||
- [(27.2)](#27.2)
|
||
|
||
is_assignable_v<T0&, const U1&> is true, and
|
||
|
||
- [(27.3)](#27.3)
|
||
|
||
is_assignable_v<T1&, const U2&> is true[.](#27.sentence-1)
|
||
|
||
[28](#28)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2359)
|
||
|
||
*Effects*: Assigns u.first to the first element of *this and u.second to the second element of *this[.](#28.sentence-1)
|
||
|
||
[29](#29)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2364)
|
||
|
||
*Returns*: *this[.](#29.sentence-1)
|
||
|
||
[ð](#lib:operator=,tuple_________)
|
||
|
||
`template<class U1, class U2> constexpr const tuple& operator=(const pair<U1, U2>& u) const;
|
||
`
|
||
|
||
[30](#30)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2375)
|
||
|
||
*Constraints*:
|
||
|
||
- [(30.1)](#30.1)
|
||
|
||
sizeof...(Types) is 2,
|
||
|
||
- [(30.2)](#30.2)
|
||
|
||
is_assignable_v<const T0&, const U1&> is true, and
|
||
|
||
- [(30.3)](#30.3)
|
||
|
||
is_assignable_v<const T1&, const U2&> is true[.](#30.sentence-1)
|
||
|
||
[31](#31)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2386)
|
||
|
||
*Effects*: Assigns u.first to the first element andu.second to the second element[.](#31.sentence-1)
|
||
|
||
[32](#32)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2391)
|
||
|
||
*Returns*: *this[.](#32.sentence-1)
|
||
|
||
[ð](#lib:operator=,tuple__________)
|
||
|
||
`template<class U1, class U2> constexpr tuple& operator=(pair<U1, U2>&& u);
|
||
`
|
||
|
||
[33](#33)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2403)
|
||
|
||
*Constraints*:
|
||
|
||
- [(33.1)](#33.1)
|
||
|
||
sizeof...(Types) is 2 and
|
||
|
||
- [(33.2)](#33.2)
|
||
|
||
is_assignable_v<T0&, U1> is true, and
|
||
|
||
- [(33.3)](#33.3)
|
||
|
||
is_assignable_v<T1&, U2> is true[.](#33.sentence-1)
|
||
|
||
[34](#34)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2411)
|
||
|
||
*Effects*: Assigns std::forward<U1>(u.first) to the first
|
||
element of *this and
|
||
|
||
std::forward<U2>(u.second) to the
|
||
second element of *this[.](#34.sentence-2)
|
||
|
||
[35](#35)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2417)
|
||
|
||
*Returns*: *this[.](#35.sentence-1)
|
||
|
||
[ð](#lib:operator=,tuple___________)
|
||
|
||
`template<class U1, class U2> constexpr const tuple& operator=(pair<U1, U2>&& u) const;
|
||
`
|
||
|
||
[36](#36)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2428)
|
||
|
||
*Constraints*:
|
||
|
||
- [(36.1)](#36.1)
|
||
|
||
sizeof...(Types) is 2,
|
||
|
||
- [(36.2)](#36.2)
|
||
|
||
is_assignable_v<const T0&, U1> is true, and
|
||
|
||
- [(36.3)](#36.3)
|
||
|
||
is_assignable_v<const T1&, U2> is true[.](#36.sentence-1)
|
||
|
||
[37](#37)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2439)
|
||
|
||
*Effects*: Assigns std::forward<U1>(u.first) to the first element and
|
||
|
||
std::forward<U2>(u.second) to the second element[.](#37.sentence-2)
|
||
|
||
[38](#38)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2444)
|
||
|
||
*Returns*: *this[.](#38.sentence-1)
|
||
|
||
[ð](#lib:operator=,tuple____________)
|
||
|
||
`template<[tuple-like](tuple.like#concept:tuple-like "22.4.3 Concept tuple-like [tuple.like]") UTuple>
|
||
constexpr tuple& operator=(UTuple&& u);
|
||
`
|
||
|
||
[39](#39)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2456)
|
||
|
||
*Constraints*:
|
||
|
||
- [(39.1)](#39.1)
|
||
|
||
[*different-from*](range.utility.helpers#concept:different-from "25.5.2 Helper concepts [range.utility.helpers]")<UTuple, tuple> ([[range.utility.helpers]](range.utility.helpers "25.5.2 Helper concepts"))
|
||
is true,
|
||
|
||
- [(39.2)](#39.2)
|
||
|
||
remove_cvref_t<UTuple> is not a specialization of ranges::subrange,
|
||
|
||
- [(39.3)](#39.3)
|
||
|
||
sizeof...(Types) equals tuple_size_v<remove_cvref_t<UTuple>>, and
|
||
|
||
- [(39.4)](#39.4)
|
||
|
||
is_assignable_v<Ti&, decltype(get<i>(std::forward<UTuple>(u)))> is true for all i[.](#39.sentence-1)
|
||
|
||
[40](#40)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2476)
|
||
|
||
*Effects*: For all i, assigns get<i>(std::forward<UTuple>(u)) to get<i>(*this)[.](#40.sentence-1)
|
||
|
||
[41](#41)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2481)
|
||
|
||
*Returns*: *this[.](#41.sentence-1)
|
||
|
||
[ð](#lib:operator=,tuple_____________)
|
||
|
||
`template<[tuple-like](tuple.like#concept:tuple-like "22.4.3 Concept tuple-like [tuple.like]") UTuple>
|
||
constexpr const tuple& operator=(UTuple&& u) const;
|
||
`
|
||
|
||
[42](#42)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2493)
|
||
|
||
*Constraints*:
|
||
|
||
- [(42.1)](#42.1)
|
||
|
||
[*different-from*](range.utility.helpers#concept:different-from "25.5.2 Helper concepts [range.utility.helpers]")<UTuple, tuple> ([[range.utility.helpers]](range.utility.helpers "25.5.2 Helper concepts"))
|
||
is true,
|
||
|
||
- [(42.2)](#42.2)
|
||
|
||
remove_cvref_t<UTuple> is not a specialization of ranges::subrange,
|
||
|
||
- [(42.3)](#42.3)
|
||
|
||
sizeof...(Types) equals tuple_size_v<remove_cvref_t<UTuple>>, and
|
||
|
||
- [(42.4)](#42.4)
|
||
|
||
is_assignable_v<const Ti&, decltype(get<i>(std::forward<UTuple>(u)))> is true for all i[.](#42.sentence-1)
|
||
|
||
[43](#43)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2513)
|
||
|
||
*Effects*: For all i, assignsget<i>(std::forward<UTuple>(u)) to get<i>(*this)[.](#43.sentence-1)
|
||
|
||
[44](#44)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L2518)
|
||
|
||
*Returns*: *this[.](#44.sentence-1)
|