Namespaces
Variants

std:: 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)
Definido en el encabezado <memory>
template < class Smart, class Pointer, class ... Args >
class inout_ptr_t ;
(desde C++23)

inout_ptr_t se utiliza para adaptar tipos como punteros inteligentes para funciones externas que restablecen la propiedad mediante un parámetro Pointer* (generalmente T** para algún tipo de objeto T ) o void ** .

inout_ptr_t captura argumentos adicionales en la construcción, proporciona un almacenamiento para el resultado que dicha función externa antes mencionada accede, libera la propiedad mantenida por el objeto Smart adaptado, y finalmente restablece el objeto Smart adaptado con el resultado y los argumentos capturados cuando es destruido.

inout_ptr_t se comporta como si contuviera los siguientes miembros de datos no estáticos:

  • una referencia Smart& , que se vincula al objeto adaptado durante la construcción,
  • para cada T en Args... , un miembro de tipo T , que es un argumento capturado durante la construcción y utilizado para el restablecimiento durante la destrucción, y
  • un subobjeto miembro adecuado para almacenar un Pointer dentro de él y proporcionar un objeto void * , donde el objeto Pointer o void * generalmente se expone a una función externa para el restablecimiento de propiedad.

Si Smart no es un tipo puntero, release ( ) se llama como máximo una vez al objeto adaptado. Las implementaciones pueden llamar release ( ) dentro del constructor, o antes del reinicio dentro del destructor si el valor de Pointer no es nulo.

Los usuarios pueden controlar si cada argumento para el restablecimiento se captura por copia o por referencia, especificando un tipo de objeto o un tipo de referencia en Args... respectivamente.

Contenidos

Parámetros de plantilla

Smart - el tipo del objeto (normalmente un puntero inteligente) a adaptar
Pointer - tipo del objeto (normalmente un puntero en bruto) al que una función externa accede para el restablecimiento de propiedad
Args... - tipo de argumentos capturados utilizados para restablecer el objeto adaptado
Requisitos de tipo
-
Pointer debe cumplir con los requisitos de NullablePointer .
-
El programa está mal formado si Smart es una especialización de std::shared_ptr .

Especializaciones

A diferencia de la mayoría de las plantillas de clase en la biblioteca estándar, las especializaciones definidas por el programa de inout_ptr_t que dependen de al menos un tipo definido por el programa no necesitan cumplir con los requisitos de la plantilla principal.

Esta licencia permite que una especialización definida por el programa exponga el puntero en bruto almacenado dentro de un puntero inteligente no estándar a funciones externas.

Funciones miembro

construye un inout_ptr_t
(función miembro pública)
operator=
[eliminado] (C++23)
inout_ptr_t no es asignable
(función miembro pública)
reinicia el puntero inteligente adaptado después de liberar su propiedad
(función miembro pública)
convierte el inout_ptr_t a la dirección del almacenamiento para salida
(función miembro pública)

Funciones no miembro

(C++23)
crea un inout_ptr_t con un puntero inteligente asociado y argumentos de reinicio
(plantilla de función)

Notas

inout_ptr_t espera que las funciones externas liberen la propiedad representada por el valor del Pointer apuntado, y luego lo reinicialicen. Dado que esta operación requiere propiedad única, el uso con std::shared_ptr está prohibido.

El uso típico de inout_ptr_t es crear sus objetos temporales mediante std::inout_ptr , que restablece inmediatamente el puntero inteligente adaptado. Por ejemplo, dada una función establecedora y un puntero inteligente del tipo apropiado declarado con int foreign_resetter ( T ** ) ; y std:: unique_ptr < T, D > up ; respectivamente,

if (int ec = foreign_resetter(std::inout_ptr(up)))
    return ec;

es aproximadamente equivalente a

T *raw_p = up.get();
up.release();
int ec = foreign_resetter(&raw_p);
up.reset(raw_p);
if (ec != 0)
    return ec;

No se recomienda crear un objeto inout_ptr_t con una duración de almacenamiento diferente a la duración de almacenamiento automática, porque dicho código probablemente producirá referencias colgantes y resultará en comportamiento indefinido durante la destrucción.

Los argumentos capturados típicamente se empaquetan en un std:: tuple < Args... > . Las implementaciones pueden utilizar diferentes mecanismos para proporcionar el objeto Pointer o void * que necesitan contener.


Macro de prueba de características Valor Estándar Característica
__cpp_lib_out_ptr 202106L (C++23) std::out_ptr , std::inout_ptr
202311L (C++26) Implementación independiente de std::out_ptr y std::inout_ptr

Ejemplo

Véase también

(C++23)
interopera con establecedores de punteros externos y restablece un puntero inteligente en la destrucción
(plantilla de clase)
(C++11)
puntero inteligente con semántica de propiedad única de objetos
(plantilla de clase)
(C++11)
puntero inteligente con semántica de propiedad compartida de objetos
(plantilla de clase)