Namensräume
Varianten
Aktionen

std::pmr::polymorphic_allocator<T>::construct

Von cppreference.com
 
 
Speicherverwaltungsbibliothek
(nur Exposition*)
Algorithmen für uninitialisierten Speicher
(C++17)
(C++17)
(C++17)
Beschränkte uninitialisierte
Speicher-Algorithmen
C-Bibliothek

Allocatoren
Speicherressourcen
Unterstützung für Garbage Collection
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
Uninitialisierter Speicher
Explizites Lebenszeitmanagement
 
 
template< class U, class... Args >
void construct( U* p, Args&&... args );
(1) (seit C++17)
template< class T1, class T2, class... Args1, class... Args2 >

void construct( std::pair<T1, T2>* p,
                std::piecewise_construct_t,
                std::tuple<Args1...> x,

                std::tuple<Args2...> y );
(2) (seit C++17)
(bis C++20)
template< class T1, class T2 >
void construct( std::pair<T1, T2>* p );
(3) (seit C++17)
(bis C++20)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, U&& x, V&& y );
(4) (seit C++17)
(bis C++20)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, const std::pair<U, V>& xy );
(5) (seit C++17)
(bis C++20)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, std::pair<U, V>&& xy );
(6) (seit C++17)
(bis C++20)
template< class T1, class T2, class NonPair >
void construct( std::pair<T1, T2>* p, NonPair&& non_pair );
(7) (seit C++17)
(bis C++20)

Konstruiert ein Objekt in zugewiesenem, aber nicht initialisiertem Speicher, auf den p zeigt, mit den übergebenen Konstruktorargumenten. Wenn das Objekt von einem Typ ist, der selbst Alloziatoren verwendet, oder wenn es sich um std::pair handelt, wird *this an das konstruierte Objekt weitergegeben.

1) Erstellt ein Objekt des gegebenen Typs U mittels uses-allocator construction an der uninitialisierten Speicherstelle, die durch p angegeben ist, unter Verwendung von *this als Alloziator. Dieser Überladung nimmt nur an der Überladungsauflösung teil, wenn U keine Spezialisierung von std::pair ist.(bis C++20)
2) Zuerst, falls entweder T1 oder T2 alloziator-aware ist, modifiziert die Tupel x und y, um this->resource() einzuschließen, was zu den zwei neuen Tupeln xprime und yprime führt, gemäß den folgenden drei Regeln:
2a) wenn T1 nicht alloziator-aware ist (std::uses_allocator<T1, polymorphic_allocator>::value==false) und std::is_constructible<T1, Args1...>::value==true, dann ist xprime x, unverändert.
2b) wenn T1 alloziator-aware ist (std::uses_allocator<T1, polymorphic_allocator>::value==true), und sein Konstruktor einen Alloziator-Tag annimmt (std::is_constructible<T1, std::allocator_arg_t, polymorphic_allocator, Args1...>::value==true), dann ist xprime std::tuple_cat(std::make_tuple(std::allocator_arg, *this), std::move(x)).
2c) wenn T1 alloziator-aware ist (std::uses_allocator<T1, polymorphic_allocator>::value==true), und sein Konstruktor den Alloziator als letztes Argument annimmt (std::is_constructible<T1, Args1..., polymorphic_allocator>::value==true), dann ist xprime std::tuple_cat(std::move(x), std::make_tuple(*this)).
2d) Andernfalls ist das Programm ill-formed.
Dieselben Regeln gelten für T2 und den Ersatz von y durch yprime.
Sobald xprime und yprime konstruiert sind, wird das Paar p im zugewiesenen Speicher konstruiert, als ob durch ::new((void *) p) pair<T1, T2>(std::piecewise_construct, std::move(xprime), std::move(yprime));.
3) Äquivalent zu construct(p, std::piecewise_construct, std::tuple<>(), std::tuple<>()), d.h. übergibt die Speicherressource an die Member-Typen des Paares, falls diese sie akzeptieren.
5) Äquivalent zu
6) Äquivalent zu
7) Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn die Exposition-Only-Funktion-Template
template< class A, class B >
void /*deduce-as-pair*/( const std::pair<A, B>& );

, /*deduce-as-pair*/(non_pair) als nicht ausgewerteter Operand ill-formed ist. Äquivalent zu

construct<T1, T2, T1, T2>(p, std::forward<NonPair>(non_pair));
(bis C++20)

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
non_pair - Nicht-pair-Argument, das für die weitere Konstruktion in pair konvertiert wird

[bearbeiten] Rückgabewert

(keine)

[bearbeiten] Anmerkungen

Diese Funktion wird (über std::allocator_traits) von jedem alloziator-aware Objekt aufgerufen, wie z.B. std::pmr::vector (oder einem anderen std::vector, dem ein std::pmr::polymorphic_allocator als zu verwendender Alloziator übergeben wurde).

[bearbeiten] Defect reports

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 2969 C++17 uses-allocator construction übergab resource() übergibt *this
LWG 2975 C++17 erste Überladung wird versehentlich für die Paar-Konstruktion in einigen Fällen verwendet eingeschränkt, um keine Paare zu akzeptieren
LWG 3525 C++17 keine Überladung konnte nicht-pair-Typen, die in pair konvertierbar sind, behandeln rekonstruierende Überladung hinzugefügt

[bearbeiten] Siehe auch

[static]
konstruiert ein Objekt im allozierten Speicher
(function template) [edit]
(bis C++20)
konstruiert ein Objekt im allokierten Speicher
(öffentliche Memberfunktion von std::allocator<T>) [bearbeiten]