Namespaces
Variants

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

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)
std::out_ptr_t
Member functions
out_ptr_t::operator Pointer* out_ptr_t::operator void**
Non-member functions
operator Pointer * ( ) const noexcept ;
(1) (seit C++23)
operator void ** ( ) const noexcept ;
(2) (seit C++23)

Macht die Adresse eines Pointer oder void * -Objekts für eine externe Funktion verfügbar, die es in der Regel neu initialisieren wird.

1) Konvertiert * this in die Adresse des gespeicherten Pointer -Objekts.
2) Konvertiert * this zur Adresse eines void * -Objekts. Diese Konvertierungsfunktion nimmt nur an der Überladungsauflösung teil, wenn Pointer nicht identisch mit void * ist, und das Programm ist fehlerhaft, wenn Pointer kein Zeigertyp ist.
Der Anfangswert des void * -Objekts entspricht dem Wert des gespeicherten Pointer -Objekts, konvertiert zu void * , und jede Änderung daran beeinflusst den Pointer -Wert, der im Destruktor verwendet wird. Der Zugriff auf das void * -Objekt außerhalb der Lebensdauer von * this hat undefiniertes Verhalten.

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

Inhaltsverzeichnis

Parameter

(keine)

Rückgabewert

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

Hinweise

Wenn das Objekt, auf das der Rückgabewert zeigt, nicht überschrieben wurde, ist es gleich nullptr .

Auf gängigen Implementierungen ist die Objektdarstellung jedes Pointer , das ein Zeigertyp ist, kompatibel mit der von void * , und daher speichern diese Implementierungen typischerweise das void * -Objekt innerhalb des Speichers für das Pointer -Objekt, ohne dass zusätzlicher Speicher benötigt wird:

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

Wenn Pointer ein Zeigertyp ist, dessen Objektdarstellung inkompatibel mit der von void * ist, kann eine zusätzliche bool -Markierung erforderlich sein, um festzuhalten, ob (1) (oder (2) ) aufgerufen wurde.

Beispiel