Namespaces
Variants

std:: out_ptr_t

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Definiert im Header <memory>
template < class Smart, class Pointer, class ... Args >
class out_ptr_t ;
(seit C++23)

out_ptr_t wird verwendet, um Typen wie Smart Pointer für Fremdfunktionen anzupassen, die ihre Ergebnisse über einen Pointer* (üblicherweise T** für einen Objekttyp T ) oder einen void ** -Parameter ausgeben.

out_ptr_t erfasst bei der Konstruktion zusätzliche Argumente, stellt Speicher für das Ergebnis bereit, in das die erwähnte Fremdfunktion schreibt, und setzt schließlich das angepasste Smart -Objekt mit dem Ergebnis und den erfassten Argumenten zurück, wenn es zerstört wird.

out_ptr_t verhält sich, als ob es die folgenden nicht-statischen Datenelemente enthält:

  • eine Smart& -Referenz, die bei der Konstruktion an das angepasste Objekt gebunden wird,
  • für jedes T in Args... , ein Member vom Typ T , der bei der Konstruktion erfasst wird und beim Destruieren für das Zurücksetzen verwendet wird, und
  • ein Member-Subobjekt, das geeignet ist, einen Pointer darin zu speichern und ein void * -Objekt bereitzustellen, wobei der Pointer oder das void * -Objekt typischerweise einer Fremdfunktion zur Reinitialisierung übergeben wird.

Benutzer können steuern, ob jedes Argument für das Zurücksetzen durch Kopie oder durch Referenz erfasst wird, indem sie einen Objekttyp oder einen Referenztyp in Args... angeben.

Inhaltsverzeichnis

Template-Parameter

Smart - der Typ des Objekts (typischerweise ein Smart Pointer), der angepasst werden soll
Pointer - Typ des Objekts (typischerweise ein Rohzeiger), in den eine externe Funktion ihr Ergebnis schreibt
Args... - Typ der erfassten Argumente, die zum Zurücksetzen des angepassten Objekts verwendet werden
Typanforderungen
-
Pointer muss die Anforderungen von NullablePointer erfüllen.
-
Das Programm ist fehlerhaft, wenn Smart eine std::shared_ptr Spezialisierung ist und sizeof... ( Args ) == 0 .

Spezialisierungen

Im Gegensatz zu den meisten Klassentemplates in der Standardbibliothek müssen programmdefinierte Spezialisierungen von out_ptr_t , die von mindestens einem programmdefinierten Typ abhängen, nicht die Anforderungen der Primärvorlage erfüllen.

Diese Lizenz erlaubt einer programmdefinierten Spezialisierung, den rohen Zeiger, der in einem nicht-standardmäßigen Smart Pointer gespeichert ist, für externe Funktionen verfügbar zu machen.

Memberfunktionen

konstruiert ein out_ptr_t
(öffentliche Elementfunktion)
operator=
[gelöscht] (C++23)
out_ptr_t ist nicht zuweisbar
(öffentliche Elementfunktion)
setzt den adaptierten Smart Pointer zurück
(öffentliche Elementfunktion)
konvertiert das out_ptr_t in die Adresse des Speichers für die Ausgabe
(öffentliche Elementfunktion)

Nicht-Member-Funktionen

(C++23)
erzeugt einen out_ptr_t mit einem assoziierten Smart Pointer und Reset-Argumenten
(Funktions-Template)

Hinweise

out_ptr_t erwartet, dass die Fremdfunktionen den Wert des gezeigten Pointer nicht verwenden und ihn nur neu initialisieren. Der Wert des Smart Pointers vor der Anpassung wird nicht verwendet.

Die typische Verwendung von out_ptr_t besteht darin, temporäre Objekte durch std::out_ptr zu erstellen, die den angepassten Smart Pointer sofort zurücksetzen. Zum Beispiel, gegeben eine Setter-Funktion und einen Smart Pointer des entsprechenden Typs, deklariert mit int foreign_setter ( T ** ) ; und std:: unique_ptr < T, D > up ; jeweils,

int foreign_setter(T**);
std::unique_ptr<T, D> up;
if (int ec = foreign_setter(std::out_ptr(up)))
    return ec;

entspricht in etwa

int foreign_setter(T**);
std::unique_ptr<T, D> up;
T* raw_p{};
int ec = foreign_setter(&raw_p);
up.reset(raw_p);
if (ec != 0)
    return ec;
**Hinweis:** Der gesamte Code innerhalb der `
` Tags wurde gemäß den Anweisungen nicht übersetzt, da es sich um C++-Code handelt. Die HTML-Struktur und Attribute bleiben ebenfalls unverändert.

Es wird nicht empfohlen, ein out_ptr_t -Objekt mit einer anderen Speicherdauer als der automatischen Speicherdauer zu erstellen, da solcher Code wahrscheinlich hängende Referenzen erzeugt und bei der Zerstörung zu undefiniertem Verhalten führt.

out_ptr_t verbietet die Verwendung, die einen std::shared_ptr ohne Angabe eines Deleters zurücksetzen würde, da dies std::shared_ptr::reset aufrufen und einen benutzerdefinierten Deleter später ersetzen würde.

Erfasste Argumente werden typischerweise in ein std:: tuple < Args... > gepackt. Implementierungen können verschiedene Mechanismen verwenden, um das Pointer - oder void * -Objekt bereitzustellen, das sie halten müssen.

Feature-Test Makro Wert Std Feature
__cpp_lib_out_ptr 202106L (C++23) std::out_ptr , std::inout_ptr
202311L (C++26) Freestanding std::out_ptr und std::inout_ptr

Beispiel

Siehe auch

interagiert mit Fremdzeigersetzern, ermittelt den anfänglichen Zeigerwert aus einem Smart Pointer und setzt ihn bei Zerstörung zurück
(Klassentemplate)
(C++11)
Smart Pointer mit eindeutiger Objektbesitzsemantik
(Klassentemplate)
(C++11)
Smart Pointer mit gemeinsamer Objektbesitzsemantik
(Klassentemplate)