std::inout_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::inout_ptr_t<Smart,Pointer,Args...>::operator void**
operator Pointer*() const noexcept; |
(1) | (desde C++23) |
operator void**() const noexcept; |
(2) | (desde C++23) |
Expone la dirección de un objeto Pointer
o void* a una función externa que generalmente liberará la propiedad representada por su value y luego lo reinicializará.
Pointer
almacenado.Pointer
no es lo mismo que void*, y el programa está mal formado si Pointer
no es un tipo puntero. El valor inicial del objeto void* es igual al valor del objeto
Pointer
almacenado, convertido a void*, y cualquier modificación en él afecta el valor de Pointer
utilizado en el destructor. Acceder al objeto void* fuera del tiempo de vida de *this tiene un comportamiento no definido.Una vez que se ha llamado a una de estas dos funciones de conversión en un objeto inout_ptr_t
, no se llamará a la otra, de lo contrario, el comportamiento no está definido.
Contenido |
[editar] Parámetros
(Ninguno)
[editar] Valor de retorno
Pointer
almacenado.[editar] Notas
Si el objeto al que apunta el valor devuelto no ha sido reescrito, es igual al valor retenido por el objeto Smart
adaptado antes de la construcción.
En implementaciones comunes, la representación de objeto de cada Pointer
que es un tipo puntero es compatible con la de void* y, por lo tanto, estas implementaciones normalmente almacenan un objeto void* dentro del almacenamiento para el objeto Pointer
. No se necesita almacenamiento adicional:
- Si la implementación permite el análisis de alias basado en tipos (que se basa en la estricta regla de alias), puede usarse un subobjeto miembro std::byte[sizeof(void*)] apropiadamente alineado, y ambas funciones de conversión devuelven la dirección de los objetos creados implícitamente dentro del array.
- De lo contrario, puede usarse un subobjeto miembro
Pointer
para ambas funciones de conversión, y (2) puede devolver directamente su dirección de reinterpret_cast a void**.
Si Pointer
es un tipo puntero cuya representación de objeto es incompatible con la de void*, es posible que se necesite un indicador bool adicional para registrar si (1) (o (2)) ha sido llamada.
[editar] Ejemplo
Esta sección está incompleta Razón: sin ejemplo |