std::scoped_allocator_adaptor<OuterAlloc,InnerAlloc...>::construct
| Definiert in Header <scoped_allocator> |
||
| template< class T, class... Args > void construct( T* p, Args&&... args ); |
(1) | |
| template< class T1, class T2, class... Args1, class... Args2 > void construct( std::pair<T1, T2>* p, std::piecewise_construct_t, |
(2) | (bis C++20) |
| template< class T1, class T2 > void construct( std::pair<T1, T2>* p ); |
(3) | (bis C++20) |
| template< class T1, class T2, class U, class V > void construct( std::pair<T1, T2>* p, U&& x, V&& y ); |
(4) | (bis C++20) |
| (5) | (bis C++20) | |
| (6) | (bis C++20) | |
| Hilfs-Funktionale |
||
template < class T, class... Args > std::tuple</* siehe unten */> /*concat-args*/( std::tuple<Args...>&& tup ); |
(7) | (nur Exposition*) (bis C++20) |
Konstruiert ein Objekt im zugewiesenen, aber noch nicht initialisierten Speicher, auf den von p gezeigt wird, unter Verwendung des äußeren Allocators und der bereitgestellten Konstruktorargumente. Wenn das Objekt von einem Typ ist, der selbst Allocatoren verwendet, oder wenn es ein std::pair ist(bis C++20), wird der innere Allocator an das konstruierte Objekt weitergegeben.
T durch Uses-Allocator-Konstruktion an der uninitialisierten Speicherstelle, die von p angegeben wird, unter Verwendung des äußersten Allocators.|
Gegeben std::uses_allocator<T, inner_allocator_type>::value als uses_inner
Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn |
(bis C++20) |
|
Äquivalent zu std::apply |
(seit C++20) |
concat-args <T1>(std::move(x)), yprime concat-args <T2>(std::move(y)), ruft outermost-construct (p, std::piecewise_construct, std::move(xprime), std::move(yprime)) auf.std::forward_as_tuple(xarg), std::forward_as_tuple(yarg));, wobei xarg und yarg wie folgt definiert sind
| Überladung | xarg | yarg |
|---|---|---|
| (4) | std::forward<U>(x) | std::forward<V>(y) |
| (5) | xy.first | xy.second |
| (6) | std::forward<U>(xy.first) | std::forward<V>(xy.second) |
T erforderlich sind.- Wenn uses_inner false ist und std::is_constructible<T, Args...>::value true ist, wird std::tuple<Args&&...>(std::move(tup)) zurückgegeben.
- Andernfalls, wenn uses_inner und std::is_constructible<T, std::allocator_arg_t,
inner_allocator_type&,
Args...>::value beide true sind, wird std::tuple_cat(std::tuple<std::allocator_arg_t, inner_allocator_type&>
(std::allocator_arg, inner_allocator()),
std::tuple<Args&&...>(std::move(tup))) zurückgegeben. - Andernfalls, wenn uses_inner und std::is_constructible<T, Args..., inner_allocator_type&>::value beide true sind, wird std::tuple_cat(std::tuple<Args&&...>(std::move(tup)),
std::tuple<inner_allocator_type&>(inner_allocator()) zurückgegeben. - Andernfalls ist das Programm fehlerhaft.
Inhalt |
[bearbeiten] Parameter
| p | - | Zeiger auf zugewiesenen, aber nicht initialisierten Speicher |
| args | - | die Konstruktorargumente, die an den Konstruktor von T übergeben werden sollen |
| x | - | die Konstruktorargumente, die an den Konstruktor von T1 übergeben werden sollen |
| y | - | die Konstruktorargumente, die an den Konstruktor von T2 übergeben werden sollen |
| xy | - | das Paar, dessen zwei Member die Konstruktorargumente für T1 und T2 sind |
| tup | - | die zu kombinierenden Argumente |
[bearbeiten] Hinweise
Diese Funktion wird (über std::allocator_traits) von jedem allocator-bewussten Objekt, wie z.B. std::vector, aufgerufen, dem ein std::scoped_allocator_adaptor als zu verwendender Allocator übergeben wurde. Da inner_allocator_type selbst eine Spezialisierung von std::scoped_allocator_adaptor ist, wird diese Funktion auch dann aufgerufen, wenn die durch diese Funktion konstruierten allocator-bewussten Objekte beginnen, ihre eigenen Member zu konstruieren.
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2203 | C++11 | innere Allocatoren wurden durch Wertinitialisierung erhalten ein inner_allocator_type-Objekt |
erhalten durch Aufruf von inner_allocator() |
| LWG 2511 (P0475R1) |
C++11 | concat-args könnte Elemente von std::tuples kopieren |
alle Elementkopieroperationen eliminiert |
| LWG 2586 | C++11 | nur Konstruktionen voninner_allocator_type rvalues wurden geprüft |
prüft Konstruktionen von nicht-constinner_allocator_type lvalues stattdessen |
| LWG 2975 | C++11 | Überladung (1) war nicht eingeschränkt | eingeschränkt, um std::pair abzulehnen |
[bearbeiten] Siehe auch
| [static] |
konstruiert ein Objekt im allozierten Speicher (function template) |
| (bis C++20) |
konstruiert ein Objekt im allokierten Speicher (öffentliche Memberfunktion von std::allocator<T>) |