std::indirect<T, Allocator>::indirect
From cppreference.com
constexpr explicit indirect(); |
(1) | (since C++26) |
constexpr explicit indirect( std::allocator_arg_t, const Allocator& a ); |
(2) | (since C++26) |
template< class U = T > constexpr explicit indirect( U&& v ); |
(3) | (since C++26) |
template< class U = T > constexpr explicit indirect( std::allocator_arg_t, const Allocator& a, |
(4) | (since C++26) |
template< class... Args > constexpr explicit indirect( std::in_place_t, Args&&... args ); |
(5) | (since C++26) |
template< class... Args > constexpr explicit indirect( std::allocator_arg_t, const Allocator& a, |
(6) | (since C++26) |
template< class I, class... Args > constexpr explicit indirect( std::in_place_t, std::initializer_list<I> ilist, |
(7) | (since C++26) |
template< class I, class... Args > constexpr explicit indirect( std::allocator_arg_t, const Allocator& a, |
(8) | (since C++26) |
constexpr indirect( const indirect& other ); |
(9) | (since C++26) |
constexpr indirect( std::allocator_arg_t, const Allocator& a, const indirect& other ); |
(10) | (since C++26) |
constexpr indirect( indirect&& other ) noexcept; |
(11) | (since C++26) |
constexpr indirect( std::allocator_arg_t, const Allocator& a, indirect&& other ) noexcept(/* see below */); |
(12) | (since C++26) |
Constructs a new indirect object.
Contents |
[edit] Parameters
| a | - | the allocator to be associated |
| v | - | value with which to initialize the owned value |
| args | - | arguments with which to initialize the owned value |
| il | - | initializer list with which to initialize the owned value |
| other | - | another indirect object whose owned value (if exists) is copied
|
[edit] Effects
The construction of a new indirect object consists of the following steps:
1) Constructs the associated allocator
alloc :
- If the initializer for
allocis empty, it is value-initialized. - If the initializer for
allocis not empty, it is direct-non-list-initialized with the initializer argument.
2) Constructs the owned object:
- For overloads (1-8), initialize
pwith the result of calling std::allocator_traits<Allocator>::allocate, then calls std::allocator_traits<Allocator>::construct(alloc,p, args...), where args... is an expression pack containing the initializer arguments. - For overloads (9-12):
- If other is valueless, no owned object is constructed, and *this is also valueless after construction.
- Otherwise, if other is an rvalue reference and
allocequals other.alloc, *this takes ownership of the owned object of other. - Otherwise, the owned object is constructed using
allocas described above.
| Overload | Initializer for... | valueless_after_move()after construction | |
|---|---|---|---|
alloc
|
the owned object | ||
| (1) | (empty) | (empty) | false |
| (2) | a | ||
| (3) | (empty) | std::forward<U>(v) | |
| (4) | a | ||
| (5) | (empty) | std::forward<Args>(args) | |
| (6) | a | ||
| (7) | (empty) | ilist, std::forward<Args>(args) | |
| (8) | a | ||
| (9) | see below | *other (only if other owns a value) |
true only if other is valueless |
| (10) | a | ||
| (11) | std::move(other.alloc )
|
takes ownership (only if other owns a value) | |
| (12) | a | see below | |
9)
alloc is direct-non-list-initialized with std::allocator_traits<Allocator>:: select_on_container_copy_construction(other.alloc ).12) The owned object is constructed as follows:
[edit] Constraints and supplement information
1) This overload participates in overload resolution only if std::is_default_constructible_v<Allocator> is true.
3-8) These overloads participate in overload resolution only if std::is_constructible_v<T, /* argument types */> is true, where /* argument types */ are:
3,4)
U5,6)
Args...7,8) std::initializer_list<I>&, Args...
3,5,7) These overloads participate in overload resolution only if std::is_default_constructible_v<Allocator> is true.
3,4) These overloads participate in overload resolution only if the following values are all false:
- std::is_same_v<std::remove_cvref_t<U>, std::indirect>
- std::is_same_v<std::remove_cvref_t<U>, std::in_place_t>
11,12) When the construction completes, other is valueless.
12) If std::allocator_traits<Allocator>::is_always_equal::value is false and
T is an incomplete type, the program is ill-formed.[edit] Exceptions
Throws nothing unless std::allocator_traits<Allocator>::allocate or std::allocator_traits<Allocator>::construct throws.
12)
noexcept specification:
noexcept(std::allocator_traits<Allocator>::is_always_equal::value)
[edit] Example
| This section is incomplete Reason: no example |
[edit] See also
| (C++11) |
tag type used to select allocator-aware constructor overloads (class) |
| in-place construction tag (tag) |