std::out_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::out_ptr_t<Smart,Pointer,Args...>::operator void**
| 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.
Pointer-Objekts.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
Pointer-Objekts.[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
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |