std:: inout_ptr_t
|
Definiert im Header
<memory>
|
||
|
template
<
class
Smart,
class
Pointer,
class
...
Args
>
class inout_ptr_t ; |
(seit C++23) | |
inout_ptr_t
wird verwendet, um Typen wie Smart Pointer für Fremdfunktionen anzupassen, die den Besitz über einen
Pointer*
(üblicherweise
T**
für einen Objekttyp
T
) oder einen
void
**
-Parameter zurücksetzen.
inout_ptr_t
erfasst zusätzliche Argumente bei der Konstruktion, stellt einen Speicher für das Ergebnis bereit, auf den eine solche oben genannte Fremdfunktion zugreift, gibt den Besitz frei, der vom angepassten
Smart
-Objekt gehalten wird, und setzt schließlich das angepasste
Smart
-Objekt mit dem Ergebnis und den erfassten Argumenten zurück, wenn es zerstört wird.
inout_ptr_t
verhält sich so, 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 für das Zurücksetzen während der Destruktion 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 Besitzrücksetzung übergeben wird.
Wenn
Smart
kein Zeigertyp ist,
release
(
)
wird höchstens einmal für das angepasste Objekt aufgerufen. Implementierungen können
release
(
)
innerhalb des Konstruktors oder vor dem Zurücksetzen innerhalb des Destruktors aufrufen, falls der
Pointer
-Wert nicht null ist.
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), auf den eine externe Funktion für den Besitzrücksetzvorgang zugreift |
| Args... | - | Typ der erfassten Argumente, die zum Rücksetzen des angepassten Objekts verwendet werden |
| Typanforderungen | ||
-
Pointer
muss die Anforderungen von
NullablePointer
erfüllen.
|
||
-
Smart
eine
std::shared_ptr
Spezialisierung ist.
|
||
Spezialisierungen
Im Gegensatz zu den meisten Klassentemplates in der Standardbibliothek
müssen
programmdefinierte Spezialisierungen
von
inout_ptr_t
, die von mindestens einem
programmdefinierten Typ
abhängen, die Anforderungen der Primärvorlage nicht erfüllen.
Diese Lizenz erlaubt einer programmdefinierten Spezialisierung, den rohen Zeiger, der in einem nicht-standardmäßigen Smart Pointer gespeichert ist, für Fremdfunktionen verfügbar zu machen.
Memberfunktionen
|
(C++23)
|
konstruiert ein
inout_ptr_t
(öffentliche Elementfunktion) |
|
operator=
[gelöscht]
(C++23)
|
inout_ptr_t
ist nicht zuweisbar
(öffentliche Elementfunktion) |
|
(C++23)
|
setzt den adaptierten Smart Pointer nach Freigabe seines Besitzes zurück
(öffentliche Elementfunktion) |
konvertiert das
inout_ptr_t
in die Adresse des Speichers für die Ausgabe
(öffentliche Elementfunktion) |
Nicht-Member-Funktionen
|
(C++23)
|
erstellt einen
inout_ptr_t
mit einem assoziierten Smart Pointer und Reset-Argumenten
(Funktions-Template) |
Hinweise
inout_ptr_t
erwartet, dass die Fremdfunktionen den durch den Wert des gezeigten
Pointer
repräsentierten Besitz freigeben und ihn anschließend neu initialisieren. Da ein solcher Vorgang eindeutigen Besitz erfordert, ist die Verwendung mit
std::shared_ptr
nicht zulässig.
Die typische Verwendung von
inout_ptr_t
besteht darin, temporäre Objekte durch
std::inout_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_resetter
(
T
**
)
;
und
std::
unique_ptr
<
T, D
>
up
;
jeweils,
if (int ec = foreign_resetter(std::inout_ptr(up))) return ec;
entspricht in etwa
T *raw_p = up.get(); up.release(); int ec = foreign_resetter(&raw_p); up.reset(raw_p); if (ec != 0) return ec;
Es wird nicht empfohlen, ein
inout_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.
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 fremden Pointer-Settern und setzt einen Smart Pointer bei Zerstörung zurück
(Klassen-Template) |
|
(C++11)
|
Smart Pointer mit eindeutiger Objektbesitz-Semantik
(Klassen-Template) |
|
(C++11)
|
Smart Pointer mit gemeinsamer Objektbesitz-Semantik
(Klassen-Template) |