std:: out_ptr_t
|
Definido en el encabezado
<memory>
|
||
|
template
<
class
Smart,
class
Pointer,
class
...
Args
>
class out_ptr_t ; |
(desde C++23) | |
out_ptr_t
se utiliza para adaptar tipos como punteros inteligentes para funciones externas que generan sus resultados a través de un parámetro
Pointer*
(generalmente
T**
para algún tipo de objeto
T
) o
void
**
.
out_ptr_t
captura argumentos adicionales en la construcción, proporciona almacenamiento para el resultado al que escribe dicha función externa mencionada anteriormente, y finalmente restablece el objeto adaptado
Smart
con el resultado y los argumentos capturados cuando es destruido.
out_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
TenArgs..., un miembro de tipoT, que es un argumento capturado durante la construcción y utilizado para el reinicio durante la destrucción, y -
un subobjeto miembro adecuado para almacenar un
Pointerdentro de él y proporcionar un objeto void * , donde el objetoPointero void * generalmente se expone a una función externa para reinicialización.
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 crudo) al que una función externa escribe su resultado |
| Args... | - | tipo de argumentos capturados utilizados para restablecer el objeto adaptado |
| Requisitos de tipo | ||
-
Pointer
debe cumplir con los requisitos de
NullablePointer
.
|
||
-
Smart
es una especialización de
std::shared_ptr
y
sizeof...
(
Args
)
==
0
.
|
||
Especializaciones
A diferencia de la mayoría de las plantillas de clase en la biblioteca estándar,
las
especializaciones definidas por el programa
de
out_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
|
(C++23)
|
construye un
out_ptr_t
(función miembro pública) |
|
operator=
[eliminado]
(C++23)
|
out_ptr_t
no es asignable
(función miembro pública) |
|
(C++23)
|
reinicia el puntero inteligente adaptado
(función miembro pública) |
convierte el
out_ptr_t
a la dirección del almacenamiento para salida
(función miembro pública) |
Funciones no miembro
|
(C++23)
|
crea un
out_ptr_t
con un puntero inteligente asociado y argumentos de reinicio
(plantilla de función) |
Notas
out_ptr_t
espera que las funciones externas no utilicen el valor del puntero señalado
Pointer
, y solo lo reinicialicen. El valor del puntero inteligente antes de la adaptación no se utiliza.
El uso típico de
out_ptr_t
es crear sus objetos temporales mediante
std::out_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_setter
(
T
**
)
;
y
std::
unique_ptr
<
T, D
>
up
;
respectivamente,
int foreign_setter(T**); std::unique_ptr<T, D> up; if (int ec = foreign_setter(std::out_ptr(up))) return ec;
es aproximadamente equivalente a
int foreign_setter(T**); std::unique_ptr<T, D> up; T* raw_p{}; int ec = foreign_setter(&raw_p); up.reset(raw_p); if (ec != 0) return ec;
No se recomienda crear un objeto
out_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.
out_ptr_t
prohíbe el uso que reiniciaría un
std::shared_ptr
sin especificar un deleter, porque llamaría a
std::shared_ptr::reset
y reemplazaría un deleter personalizado posteriormente.
Los argumentos capturados típicamente se empaquetan en un
std::
tuple
<
Args...
>
. Las implementaciones pueden usar mecanismos diferentes para proporcionar el objeto
Pointer
o
void
*
que necesitan contener.
| Macro de prueba de características | Valor | Std | 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
|
Esta sección está incompleta
Motivo: sin ejemplo |
Véase también
|
(C++23)
|
interopera con establecedores de punteros externos, obtiene el valor inicial del puntero desde un puntero inteligente y lo restablece 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) |