Namensräume
Varianten
Aktionen

std::inout_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::inout_ptr_t<Smart,Pointer,Args...>::operator void**

Von cppreference.com
< cpp‎ | memory‎ | inout ptr t
 
 
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
 
std::inout_ptr_t
Memberfunktionen
inout_ptr_t::operator Pointer*inout_ptr_t::operator void**
Nicht-Member-Funktionen
 
operator Pointer*() const noexcept;
(1) (seit C++23)
operator void**() const noexcept;
(2) (seit C++23)

Exponiert die Adresse eines Pointer- oder void*-Objekts gegenüber einer Fremdfunktion, welche typischerweise den durch ihren Wert repräsentierten Besitz freigibt und ihn dann neu initialisiert.

1) Konvertiert *this zur Adresse des gespeicherten Pointer-Objekts.
2) Konvertiert *this zur Adresse eines void*-Objekts. Diese Konvertierungsfunktion nimmt nur an der Overload-Auflösung teil, wenn Pointer nicht gleich void* ist, und das Programm ist fehlerhaft, wenn Pointer kein Zeigertyp ist.
Der Anfangswert des void*-Objekts ist gleich dem Wert des gespeicherten Pointer-Objekts, konvertiert zu void*, und jede Modifikation daran beeinflusst den im Destruktor verwendeten Pointer-Wert. Der Zugriff auf das void*-Objekt außerhalb der Lebenszeit von *this hat undefiniertes Verhalten.

Sobald eine dieser beiden Konvertierungsfunktionen auf einem inout_ptr_t-Objekt aufgerufen wurde, darf die andere nicht mehr darauf aufgerufen werden, andernfalls ist das Verhalten undefiniert.

Inhalt

[bearbeiten] Parameter

(keine)

[bearbeiten] Rückgabewert

1) Die Adresse des gespeicherten Pointer-Objekts.
2) Die Adresse des void*-Objekts, das die oben genannten Anforderungen erfüllt.

[bearbeiten] Hinweise

Wenn das von der Rückgabe referenzierte Objekt nicht neu geschrieben wurde, ist es gleich dem Wert, der vom angepassten Smart-Objekt vor der Konstruktion gehalten wurde.

Auf gängigen Implementierungen ist die Objektrepräsentation jedes Pointer, der ein Zeigertyp ist, mit der von void* kompatibel, und daher speichern diese Implementierungen typischerweise das void*-Objekt innerhalb des Speichers für das Pointer-Objekt, kein zusätzlicher Speicher erforderlich.

  • Wenn die Implementierung eine typbasierte Alias-Analyse (die auf der Strict-Aliasing-Regel basiert) aktiviert, kann ein korrekt ausgerichtetes std::byte[sizeof(void*)] Member-Subobjekt verwendet werden, und beide Konvertierungsfunktionen geben die Adresse von Objekten zurück, die implizit erstellt wurden innerhalb des Arrays.
  • Andernfalls kann ein Pointer-Member-Subobjekt für beide Konvertierungsfunktionen verwendet werden, und (2) kann direkt seine Adresse zurückgeben, reinterpret_cast zu void**.

Wenn Pointer ein Zeigertyp ist, dessen Objektrepräsentation inkompatibel mit der von void* ist, kann eine zusätzliche bool-Flag benötigt werden, um zu erfassen, ob (1) (oder (2)) aufgerufen wurde.

[bearbeiten] Beispiel