Namensräume
Varianten
Aktionen

std::out_ptr

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
 
 
Definiert in Header <memory>
template< class Pointer = void, class Smart, class... Args >
auto out_ptr( Smart& s, Args&&... args );
(seit C++23)

Gibt ein std::out_ptr_t mit abgeleiteten Template-Argumenten zurück, das Argumente für das Zurücksetzen per Referenz erfasst.

Das Programm ist schlecht formuliert, wenn die Konstruktion des Rückgabewerts (siehe unten) schlecht formuliert ist.

Inhalt

[edit] Parameter

s - das Objekt (typischerweise ein Smart Pointer), das angepasst werden soll
args... - die Argumente für das Zurücksetzen, die erfasst werden sollen

[edit] Rückgabewert

std::out_ptr_t<Smart, P, Args&&>(s, std::forward<Args>(args)...), wobei P Folgendes ist:

  • Pointer, wenn Pointer nicht gleich void ist. Andernfalls,
  • Smart::pointer, wenn dieser gültig ist und einen Typ bezeichnet. Andernfalls,
  • Smart::element_type*, wenn Smart::element_type gültig ist und einen Typ bezeichnet. Andernfalls,
  • std::pointer_traits<Smart>::element_type*.

[edit] Hinweise

Benutzer können das Template-Argument für den Template-Parameter Pointer angeben, um mit fremden Funktionen zu interagieren, die einen Pointer* erwarten.

Da alle Argumente für das Zurücksetzen per Referenz erfasst werden, sollte der zurückgegebene out_ptr_t ein temporäres Objekt sein, das am Ende des Ausdrucks, der den Aufruf der fremden Funktion enthält, zerstört wird, um hängende Referenzen zu vermeiden.

Feature-Test-Makro Wert Std Feature
__cpp_lib_out_ptr 202106L (C++23) std::out_ptr, std::inout_ptr
202311L (C++26) freistehendes std::out_ptr und std::inout_ptr

[edit] Beispiel

Verwenden Sie std::out_ptr, um einen Smart Pointer für sqlite3_open anzupassen, der einen sqlite3** als Ausgabe-Parameter erwartet.

#include <memory>
#include <sqlite3.h>
 
int main()
{
    auto close_db = [](sqlite3* db) { sqlite3_close(db); };
 
    {
        // open an in-memory database, and manage its lifetime with std::unique_ptr
        std::unique_ptr<sqlite3, decltype(close_db)> up;
        sqlite3_open(":memory:", std::out_ptr(up));
 
        sqlite3* db = up.get();
        // do something with db ...
    }
    {
        // same as above, but use a std::shared_ptr
        std::shared_ptr<sqlite3> sp;
        sqlite3_open(":memory:", std::out_ptr(sp, close_db));
 
        sqlite3* db = sp.get();
        // do something with db ...
    }
}

[edit] Siehe auch

(C++23)
erstellt einen inout_ptr_t mit einem zugehörigen intelligenten Zeiger und Zurücksetzungsargumenten
(Funktions-Template) [edit]
Erstellt einen unique Pointer, der ein neues Objekt verwaltet
(Funktionsschablone) [bearbeiten]
erstellt einen geteilten Zeiger, der ein neues Objekt verwaltet
(Funktionsschablone) [bearbeiten]