Init
This commit is contained in:
329
cppdraft/optional/ctor.md
Normal file
329
cppdraft/optional/ctor.md
Normal file
@@ -0,0 +1,329 @@
|
||||
[optional.ctor]
|
||||
|
||||
# 22 General utilities library [[utilities]](./#utilities)
|
||||
|
||||
## 22.5 Optional objects [[optional]](optional#ctor)
|
||||
|
||||
### 22.5.3 Class template optional [[optional.optional]](optional.optional#optional.ctor)
|
||||
|
||||
#### 22.5.3.2 Constructors [optional.ctor]
|
||||
|
||||
[1](#1)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3389)
|
||||
|
||||
The exposition-only variable template *converts-from-any-cvref* is used by some constructors for optional[.](#1.sentence-1)
|
||||
|
||||
template<class T, class W>constexpr bool *converts-from-any-cvref* = // *exposition only* disjunction_v<is_constructible<T, W&>, is_convertible<W&, T>,
|
||||
is_constructible<T, W>, is_convertible<W, T>,
|
||||
is_constructible<T, const W&>, is_convertible<const W&, T>,
|
||||
is_constructible<T, const W>, is_convertible<const W, T>>;
|
||||
|
||||
[ð](#lib:optional,constructor)
|
||||
|
||||
`constexpr optional() noexcept;
|
||||
constexpr optional(nullopt_t) noexcept;
|
||||
`
|
||||
|
||||
[2](#2)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3408)
|
||||
|
||||
*Postconditions*: *this does not contain a value[.](#2.sentence-1)
|
||||
|
||||
[3](#3)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3412)
|
||||
|
||||
*Remarks*: No contained value is initialized[.](#3.sentence-1)
|
||||
|
||||
For every object type T these constructors are constexpr constructors ([[dcl.constexpr]](dcl.constexpr "9.2.6 The constexpr and consteval specifiers"))[.](#3.sentence-2)
|
||||
|
||||
[ð](#lib:optional,constructor_)
|
||||
|
||||
`constexpr optional(const optional& rhs);
|
||||
`
|
||||
|
||||
[4](#4)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3424)
|
||||
|
||||
*Effects*: If rhs contains a value, direct-non-list-initializes the contained value
|
||||
with *rhs[.](#4.sentence-1)
|
||||
|
||||
[5](#5)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3429)
|
||||
|
||||
*Postconditions*: rhs.has_value() == this->has_value()[.](#5.sentence-1)
|
||||
|
||||
[6](#6)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3433)
|
||||
|
||||
*Throws*: Any exception thrown by the selected constructor of T[.](#6.sentence-1)
|
||||
|
||||
[7](#7)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3437)
|
||||
|
||||
*Remarks*: This constructor is defined as deleted unlessis_copy_constructible_v<T> is true[.](#7.sentence-1)
|
||||
|
||||
If is_trivially_copy_constructible_v<T> is true,
|
||||
this constructor is trivial[.](#7.sentence-2)
|
||||
|
||||
[ð](#lib:optional,constructor__)
|
||||
|
||||
`constexpr optional(optional&& rhs) noexcept(see below);
|
||||
`
|
||||
|
||||
[8](#8)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3451)
|
||||
|
||||
*Constraints*: is_move_constructible_v<T> is true[.](#8.sentence-1)
|
||||
|
||||
[9](#9)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3455)
|
||||
|
||||
*Effects*: If rhs contains a value, direct-non-list-initializes the contained value
|
||||
with *std::move(rhs)[.](#9.sentence-1)
|
||||
|
||||
rhs.has_value() is unchanged[.](#9.sentence-2)
|
||||
|
||||
[10](#10)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3461)
|
||||
|
||||
*Postconditions*: rhs.has_value() == this->has_value()[.](#10.sentence-1)
|
||||
|
||||
[11](#11)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3465)
|
||||
|
||||
*Throws*: Any exception thrown by the selected constructor of T[.](#11.sentence-1)
|
||||
|
||||
[12](#12)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3469)
|
||||
|
||||
*Remarks*: The exception specification is equivalent tois_nothrow_move_constructible_v<T>[.](#12.sentence-1)
|
||||
|
||||
If is_trivially_move_constructible_v<T> is true,
|
||||
this constructor is trivial[.](#12.sentence-2)
|
||||
|
||||
[ð](#lib:optional,constructor___)
|
||||
|
||||
`template<class... Args> constexpr explicit optional(in_place_t, Args&&... args);
|
||||
`
|
||||
|
||||
[13](#13)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3483)
|
||||
|
||||
*Constraints*: is_constructible_v<T, Args...> is true[.](#13.sentence-1)
|
||||
|
||||
[14](#14)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3487)
|
||||
|
||||
*Effects*: Direct-non-list-initializes the contained value with std::forward<Args>(args)...[.](#14.sentence-1)
|
||||
|
||||
[15](#15)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3491)
|
||||
|
||||
*Postconditions*: *this contains a value[.](#15.sentence-1)
|
||||
|
||||
[16](#16)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3495)
|
||||
|
||||
*Throws*: Any exception thrown by the selected constructor of T[.](#16.sentence-1)
|
||||
|
||||
[17](#17)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3499)
|
||||
|
||||
*Remarks*: If T's constructor selected for the initialization is a constexpr constructor, this constructor is a constexpr constructor[.](#17.sentence-1)
|
||||
|
||||
[ð](#lib:optional,constructor____)
|
||||
|
||||
`template<class U, class... Args>
|
||||
constexpr explicit optional(in_place_t, initializer_list<U> il, Args&&... args);
|
||||
`
|
||||
|
||||
[18](#18)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3511)
|
||||
|
||||
*Constraints*: is_constructible_v<T, initializer_list<U>&, Args...> is true[.](#18.sentence-1)
|
||||
|
||||
[19](#19)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3515)
|
||||
|
||||
*Effects*: Direct-non-list-initializes the contained value with il, std::forward<Args>(args)...[.](#19.sentence-1)
|
||||
|
||||
[20](#20)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3519)
|
||||
|
||||
*Postconditions*: *this contains a value[.](#20.sentence-1)
|
||||
|
||||
[21](#21)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3523)
|
||||
|
||||
*Throws*: Any exception thrown by the selected constructor of T[.](#21.sentence-1)
|
||||
|
||||
[22](#22)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3527)
|
||||
|
||||
*Remarks*: If T's constructor selected for the initialization is a constexpr constructor, this constructor is a constexpr constructor[.](#22.sentence-1)
|
||||
|
||||
[ð](#lib:optional,constructor_____)
|
||||
|
||||
`template<class U = remove_cv_t<T>> constexpr explicit(see below) optional(U&& v);
|
||||
`
|
||||
|
||||
[23](#23)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3538)
|
||||
|
||||
*Constraints*:
|
||||
|
||||
- [(23.1)](#23.1)
|
||||
|
||||
is_constructible_v<T, U> is true,
|
||||
|
||||
- [(23.2)](#23.2)
|
||||
|
||||
is_same_v<remove_cvref_t<U>, in_place_t> is false,
|
||||
|
||||
- [(23.3)](#23.3)
|
||||
|
||||
is_same_v<remove_cvref_t<U>, optional> is false, and
|
||||
|
||||
- [(23.4)](#23.4)
|
||||
|
||||
if T is cv bool,remove_cvref_t<U> is not a specialization of optional[.](#23.sentence-1)
|
||||
|
||||
[24](#24)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3548)
|
||||
|
||||
*Effects*: Direct-non-list-initializes the contained value with std::forward<U>(v)[.](#24.sentence-1)
|
||||
|
||||
[25](#25)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3552)
|
||||
|
||||
*Postconditions*: *this contains a value[.](#25.sentence-1)
|
||||
|
||||
[26](#26)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3556)
|
||||
|
||||
*Throws*: Any exception thrown by the selected constructor of T[.](#26.sentence-1)
|
||||
|
||||
[27](#27)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3560)
|
||||
|
||||
*Remarks*: If T's selected constructor is a constexpr constructor,
|
||||
this constructor is a constexpr constructor[.](#27.sentence-1)
|
||||
|
||||
The expression inside explicit is equivalent to:!is_convertible_v<U, T>
|
||||
|
||||
[ð](#lib:optional,constructor______)
|
||||
|
||||
`template<class U> constexpr explicit(see below) optional(const optional<U>& rhs);
|
||||
`
|
||||
|
||||
[28](#28)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3576)
|
||||
|
||||
*Constraints*:
|
||||
|
||||
- [(28.1)](#28.1)
|
||||
|
||||
is_constructible_v<T, const U&> is true, and
|
||||
|
||||
- [(28.2)](#28.2)
|
||||
|
||||
if T is not cv bool,*converts-from-any-cvref*<T, optional<U>> is false[.](#28.sentence-1)
|
||||
|
||||
[29](#29)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3584)
|
||||
|
||||
*Effects*: If rhs contains a value,
|
||||
direct-non-list-initializes the contained value with *rhs[.](#29.sentence-1)
|
||||
|
||||
[30](#30)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3589)
|
||||
|
||||
*Postconditions*: rhs.has_value() == this->has_value()[.](#30.sentence-1)
|
||||
|
||||
[31](#31)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3593)
|
||||
|
||||
*Throws*: Any exception thrown by the selected constructor of T[.](#31.sentence-1)
|
||||
|
||||
[32](#32)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3597)
|
||||
|
||||
*Remarks*: The expression inside explicit is equivalent to:!is_convertible_v<const U&, T>
|
||||
|
||||
[ð](#lib:optional,constructor_______)
|
||||
|
||||
`template<class U> constexpr explicit(see below) optional(optional<U>&& rhs);
|
||||
`
|
||||
|
||||
[33](#33)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3611)
|
||||
|
||||
*Constraints*:
|
||||
|
||||
- [(33.1)](#33.1)
|
||||
|
||||
is_constructible_v<T, U> is true, and
|
||||
|
||||
- [(33.2)](#33.2)
|
||||
|
||||
if T is not cv bool,*converts-from-any-cvref*<T, optional<U>> is false[.](#33.sentence-1)
|
||||
|
||||
[34](#34)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3619)
|
||||
|
||||
*Effects*: If rhs contains a value,
|
||||
direct-non-list-initializes the contained value with *std::move(rhs)[.](#34.sentence-1)
|
||||
|
||||
rhs.has_value() is unchanged[.](#34.sentence-2)
|
||||
|
||||
[35](#35)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3625)
|
||||
|
||||
*Postconditions*: rhs.has_value() == this->has_value()[.](#35.sentence-1)
|
||||
|
||||
[36](#36)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3629)
|
||||
|
||||
*Throws*: Any exception thrown by the selected constructor of T[.](#36.sentence-1)
|
||||
|
||||
[37](#37)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L3633)
|
||||
|
||||
*Remarks*: The expression inside explicit is equivalent to:!is_convertible_v<U, T>
|
||||
Reference in New Issue
Block a user