std:: out_ptr_t
|
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
TinArgs..., ein Member vom TypT, der bei der Konstruktion erfasst wird und beim Destruieren für das Zurücksetzen verwendet wird, und -
ein Member-Subobjekt, das geeignet ist, einen
Pointerdarin zu speichern und ein void * -Objekt bereitzustellen, wobei derPointeroder 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.
|
||
-
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
|
(C++23)
|
konstruiert ein
out_ptr_t
(öffentliche Elementfunktion) |
|
operator=
[gelöscht]
(C++23)
|
out_ptr_t
ist nicht zuweisbar
(öffentliche Elementfunktion) |
|
(C++23)
|
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;
` 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
|
Dieser Abschnitt ist unvollständig
Grund: Kein Beispiel |
Siehe auch
|
(C++23)
|
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) |