149 lines
4.9 KiB
Markdown
149 lines
4.9 KiB
Markdown
[variant.mod]
|
||
|
||
# 22 General utilities library [[utilities]](./#utilities)
|
||
|
||
## 22.6 Variants [[variant]](variant#mod)
|
||
|
||
### 22.6.3 Class template variant [[variant.variant]](variant.variant#variant.mod)
|
||
|
||
#### 22.6.3.5 Modifiers [variant.mod]
|
||
|
||
[ð](#lib:emplace,variant)
|
||
|
||
`template<class T, class... Args> constexpr T& emplace(Args&&... args);
|
||
`
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6244)
|
||
|
||
*Constraints*: is_constructible_v<T, Args...> is true, andT occurs exactly once in Types[.](#1.sentence-1)
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6249)
|
||
|
||
*Effects*: Equivalent to:return emplace<I>(std::forward<Args>(args)...); where I is the zero-based index of T in Types[.](#2.sentence-1)
|
||
|
||
[ð](#lib:emplace,variant_)
|
||
|
||
`template<class T, class U, class... Args>
|
||
constexpr T& emplace(initializer_list<U> il, Args&&... args);
|
||
`
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6265)
|
||
|
||
*Constraints*: is_constructible_v<T, initializer_list<U>&, Args...> is true,
|
||
and T occurs exactly once in Types[.](#3.sentence-1)
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6270)
|
||
|
||
*Effects*: Equivalent to:return emplace<I>(il, std::forward<Args>(args)...); where I is the zero-based index of T in Types[.](#4.sentence-1)
|
||
|
||
[ð](#lib:emplace,variant__)
|
||
|
||
`template<size_t I, class... Args>
|
||
constexpr variant_alternative_t<I, variant<Types...>>& emplace(Args&&... args);
|
||
`
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6286)
|
||
|
||
*Mandates*: I < sizeof...(Types)[.](#5.sentence-1)
|
||
|
||
[6](#6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6290)
|
||
|
||
*Constraints*: is_constructible_v<TI, Args...> is true[.](#6.sentence-1)
|
||
|
||
[7](#7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6294)
|
||
|
||
*Effects*: Destroys the currently contained value if valueless_by_exception() is false[.](#7.sentence-1)
|
||
|
||
Then direct-non-list-initializes the contained value of type TI with the arguments std::forward<Args>(args)...[.](#7.sentence-2)
|
||
|
||
[8](#8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6301)
|
||
|
||
*Postconditions*: index() is I[.](#8.sentence-1)
|
||
|
||
[9](#9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6305)
|
||
|
||
*Returns*: A reference to the new contained value[.](#9.sentence-1)
|
||
|
||
[10](#10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6309)
|
||
|
||
*Throws*: Any exception thrown during the initialization of the contained value[.](#10.sentence-1)
|
||
|
||
[11](#11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6313)
|
||
|
||
*Remarks*: If an exception is thrown during the initialization of the contained value,
|
||
the variant is permitted to not hold a value[.](#11.sentence-1)
|
||
|
||
[ð](#lib:emplace,variant___)
|
||
|
||
`template<size_t I, class U, class... Args>
|
||
constexpr variant_alternative_t<I, variant<Types...>>&
|
||
emplace(initializer_list<U> il, Args&&... args);
|
||
`
|
||
|
||
[12](#12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6327)
|
||
|
||
*Mandates*: I < sizeof...(Types)[.](#12.sentence-1)
|
||
|
||
[13](#13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6331)
|
||
|
||
*Constraints*: is_constructible_v<TI, initializer_list<U>&, Args...> is true[.](#13.sentence-1)
|
||
|
||
[14](#14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6335)
|
||
|
||
*Effects*: Destroys the currently contained value if valueless_by_exception() is false[.](#14.sentence-1)
|
||
|
||
Then direct-non-list-initializes the contained value of type TI with il, std::forward<Args>(args)...[.](#14.sentence-2)
|
||
|
||
[15](#15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6342)
|
||
|
||
*Postconditions*: index() is I[.](#15.sentence-1)
|
||
|
||
[16](#16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6346)
|
||
|
||
*Returns*: A reference to the new contained value[.](#16.sentence-1)
|
||
|
||
[17](#17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6350)
|
||
|
||
*Throws*: Any exception thrown during the initialization of the contained value[.](#17.sentence-1)
|
||
|
||
[18](#18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6354)
|
||
|
||
*Remarks*: If an exception is thrown during the initialization of the contained value,
|
||
the variant is permitted to not hold a value[.](#18.sentence-1)
|