[indirect.ctor] # 20 Memory management library [[mem]](./#mem) ## 20.4 Types for composite class design [[mem.composite.types]](mem.composite.types#indirect.ctor) ### 20.4.1 Class template indirect [[indirect]](indirect#ctor) #### 20.4.1.3 Constructors [indirect.ctor] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6059) The following element applies to all functions in [indirect.ctor]: [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6063) *Throws*: Nothing unless allocator_traits​::​allocate orallocator_traits​::​construct throws[.](#2.sentence-1) [🔗](#lib:indirect,constructor) `constexpr explicit indirect(); ` [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6075) *Constraints*: is_default_constructible_v is true[.](#3.sentence-1) [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6079) *Mandates*: is_default_constructible_v is true[.](#4.sentence-1) [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6083) *Effects*: Constructs an owned object of type T with an empty argument list, using the allocator *alloc*[.](#5.sentence-1) [🔗](#lib:indirect,constructor_) `constexpr explicit indirect(allocator_arg_t, const Allocator& a); ` [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6095) *Mandates*: is_default_constructible_v is true[.](#6.sentence-1) [7](#7) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6099) *Effects*: *alloc* is direct-non-list-initialized with a[.](#7.sentence-1) Constructs an owned object of type T with an empty argument list, using the allocator *alloc*[.](#7.sentence-2) [🔗](#lib:indirect,constructor__) `constexpr indirect(const indirect& other); ` [8](#8) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6112) *Mandates*: is_copy_constructible_v is true[.](#8.sentence-1) [9](#9) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6116) *Effects*: *alloc* is direct-non-list-initialized withallocator_traits​::​select_on_container_copy_construction(other.*alloc*)[.](#9.sentence-1) If other is valueless, *this is valueless[.](#9.sentence-2) Otherwise, constructs an owned object of type T with *other, using the allocator *alloc*[.](#9.sentence-3) [🔗](#lib:indirect,constructor___) `constexpr indirect(allocator_arg_t, const Allocator& a, const indirect& other); ` [10](#10) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6132) *Mandates*: is_copy_constructible_v is true[.](#10.sentence-1) [11](#11) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6136) *Effects*: *alloc* is direct-non-list-initialized with a[.](#11.sentence-1) If other is valueless, *this is valueless[.](#11.sentence-2) Otherwise, constructs an owned object of type T with *other, using the allocator *alloc*[.](#11.sentence-3) [🔗](#lib:indirect,constructor____) `constexpr indirect(indirect&& other) noexcept; ` [12](#12) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6151) *Effects*: *alloc* is direct-non-list-initialized fromstd​::​move(other.*alloc*)[.](#12.sentence-1) If other is valueless, *this is valueless[.](#12.sentence-2) Otherwise *this takes ownership of the owned object of other[.](#12.sentence-3) [13](#13) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6158) *Postconditions*: other is valueless[.](#13.sentence-1) [🔗](#lib:indirect,constructor_____) `constexpr indirect(allocator_arg_t, const Allocator& a, indirect&& other) noexcept(allocator_traits::is_always_equal::value); ` [14](#14) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6170) *Mandates*: If allocator_traits​::​is_always_equal​::​value is false then T is a complete type[.](#14.sentence-1) [15](#15) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6175) *Effects*: *alloc* is direct-non-list-initialized with a[.](#15.sentence-1) If other is valueless, *this is valueless[.](#15.sentence-2) Otherwise, if *alloc* == other.*alloc* is true, constructs an object of type indirect that takes ownership of the owned object of other[.](#15.sentence-3) Otherwise, constructs an owned object of type T with *std​::​move(other), using the allocator *alloc*[.](#15.sentence-4) [16](#16) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6187) *Postconditions*: other is valueless[.](#16.sentence-1) [🔗](#lib:indirect,constructor______) `template constexpr explicit indirect(U&& u); ` [17](#17) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6199) *Constraints*: - [(17.1)](#17.1) is_same_v, indirect> is false, - [(17.2)](#17.2) is_same_v, in_place_t> is false, - [(17.3)](#17.3) is_constructible_v is true, and - [(17.4)](#17.4) is_default_constructible_v is true[.](#17.sentence-1) [18](#18) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6212) *Effects*: Constructs an owned object of type T with std​::​forward(u), using the allocator *alloc*[.](#18.sentence-1) [🔗](#lib:indirect,constructor_______) `template constexpr explicit indirect(allocator_arg_t, const Allocator& a, U&& u); ` [19](#19) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6225) *Constraints*: - [(19.1)](#19.1) is_same_v, indirect> is false, - [(19.2)](#19.2) is_same_v, in_place_t> is false, and - [(19.3)](#19.3) is_constructible_v is true[.](#19.sentence-1) [20](#20) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6236) *Effects*: *alloc* is direct-non-list-initialized with a[.](#20.sentence-1) Constructs an owned object of type T withstd​::​forward(u), using the allocator *alloc*[.](#20.sentence-2) [🔗](#lib:indirect,constructor________) `template constexpr explicit indirect(in_place_t, Us&&... us); ` [21](#21) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6251) *Constraints*: - [(21.1)](#21.1) is_constructible_v is true, and - [(21.2)](#21.2) is_default_constructible_v is true[.](#21.sentence-1) [22](#22) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6260) *Effects*: Constructs an owned object of type T withstd​::​forward(us)..., using the allocator *alloc*[.](#22.sentence-1) [🔗](#lib:indirect,constructor_________) `template constexpr explicit indirect(allocator_arg_t, const Allocator& a, in_place_t, Us&& ...us); ` [23](#23) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6275) *Constraints*: is_constructible_v is true[.](#23.sentence-1) [24](#24) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6279) *Effects*: *alloc* is direct-non-list-initialized with a[.](#24.sentence-1) Constructs an owned object of type T withstd​::​forward(us)..., using the allocator *alloc*[.](#24.sentence-2) [🔗](#lib:indirect,constructor__________) `template constexpr explicit indirect(in_place_t, initializer_list ilist, Us&&... us); ` [25](#25) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6294) *Constraints*: - [(25.1)](#25.1) is_constructible_v&, Us...> is true, and - [(25.2)](#25.2) is_default_constructible_v is true[.](#25.sentence-1) [26](#26) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6303) *Effects*: Constructs an owned object of type T with the argumentsilist, std​::​forward(us)..., using the allocator *alloc*[.](#26.sentence-1) [🔗](#lib:indirect,constructor___________) `template constexpr explicit indirect(allocator_arg_t, const Allocator& a, in_place_t, initializer_list ilist, Us&&... us); ` [27](#27) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6318) *Constraints*: is_constructible_v&, Us...> is true[.](#27.sentence-1) [28](#28) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L6322) *Effects*: *alloc* is direct-non-list-initialized with a[.](#28.sentence-1) Constructs an owned object of type T with the argumentsilist, std​::​forward(us)..., using the allocator *alloc*[.](#28.sentence-2)