Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | memory‎ | out 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::out_ptr_t
Memberfunktionen
out_ptr_t::operator Pointer*out_ptr_t::operator void**
Nicht-Member-Funktionen
 
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 zugänglich, die es im Allgemeinen neu initialisiert.

1) Konvertiert *this in die Adresse des gespeicherten Pointer-Objekts.
2) Konvertiert *this in die Adresse eines void*-Objekts. Diese Konvertierungsfunktion nimmt nur an der Überladungsauflösung teil, wenn Pointer nicht mit void* identisch 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 Ä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 für ein out_ptr_t-Objekt aufgerufen wurde, darf die andere nicht mehr für dasselbe Objekt 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] Anmerkungen

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

Bei gängigen Implementierungen ist die Objektrepräsentation jedes Pointer, das 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, es wird kein zusätzlicher Speicher benötigt.

  • Wenn die Implementierung typbasierte Alias-Analyse aktiviert (was auf der Strict-Aliasing-Regel basiert), kann ein ordnungsgemäß 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 dessen Adresse zurückgeben, reinterpret_cast zu void**.

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

[bearbeiten] Beispiel