Namespaces
Variants

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

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)
~inout_ptr_t ( ) ;
(desde C++23)

Restablece el objeto adaptado Smart mediante el valor del objeto modificado Pointer (o el objeto void * si se ha llamado a operator void ** ( ) ) y los argumentos capturados. release ( ) puede llamarse en el objeto adaptado Smart si no es llamado por el constructor.

Sea

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

Si Smart es un tipo puntero, el destructor ejecuta

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 formado, el destructor realiza

/*do-release*/ ; if ( p ) { 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 realiza

/*do-release*/ ; if ( p ) { 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) durante la construcción, para dejar las operaciones que no lanzan excepciones al destructor.

Los argumentos capturados por valor se destruyen después de reiniciar.

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 3897 C++23 el destructor no actualizaba un puntero crudo al valor nulo sí lo hace