Espacios de nombres
Variantes

std::inout_ptr_t<Smart,Pointer,Args...>::~inout_ptr_t

De cppreference.com
 
 
Biblioteca de servicios
Apoyo del lenguaje
Apoyo de tipos (tipos básicos, RTTI)
Macros de prueba de característica de la biblioteca (C++20)
Servicios de programa
Funciones variádicas
Apoyo de corrutinas (C++20)
Apoyo de contratos (C++26)
Comparación de tres vías (C++20)
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

 
Gestión de memoria dinámica
Punteros inteligentes
(C++11)
(C++11)
(C++11)
(hasta C++17)
(C++11)
(C++23)
Asignadores de memoria
Recursos de memoria
Almacenamiento no inicializado
Algoritmos de memoria no inicializada
Algoritmos restringidos de memoria no inicializada
Apoyo para recolección de basura
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
Misceláneos
(C++20)
(C++11)
(C++11)
 
 
~inout_ptr_t();
(desde C++23)

Restablece el objeto Smart adaptado por el valor del objeto Pointer modificado (o el objeto void* si operator void**() ha sido llamado) y los argumentos capturados. Puede llamarse a release() sobre el objeto Smart adaptado si no se llama por el constructor.

Sea

  • s denota el objeto Smart adaptado,
  • args... denota los argumentos capturados,
  • p denota el valor del Pointer almacenado, o static_cast<Pointer>(*operator void**()) si operator void** ha sido llamado,
  • SP sea
    • Smart::pointer, si es válido y denota un tipo, de lo contrario,
    • Smart::element_type*, si Smart::element_type es válido y denota un tipo, de lo contrario,
    • std::pointer_traits<Smart>::element_type*, si std::pointer_traits<Smart>::element_type es válido y denota un tipo, de lo contrario,
    • Pointer,
  • /*do-release*/ denota s.release() si el constructor no llama a release(), de lo contrario, vacío.

Si Smart es un tipo puntero, el destructor ejecuta

if (p) s = static_cast<Smart>(p);, y el programa está mal formado si sizeof...(Args) > 0,

de lo contrario, si s.reset(static_cast<SP>(p), std::forward<Args>(args)...) está bien formada, el destructor ejecuta

if (p) { /*do-release*/; s.reset(static_cast<SP>(p), std::forward<Args>(args)...); },

de lo contrario, si std::is_constructible_v<Smart, SP, Args...> es true, el destructor ejecuta

if (p) { /*do-release*/; s = Smart(static_cast<SP>(p), std::forward<Args>(args)...); },

de lo contrario, el programa está mal formado.

Notas

La implementación puede asignar el almacenamiento para la estructura de datos necesaria para Smart (por ejemplo, un bloque de control) en la construcción, para dejar los trabajos de no lanzamiento al destructor.

Los argumentos capturados por valor se destruyen después del restablecimiento.