std::out_ptr_t<Smart,Pointer,Args...>::operator Pointer*, std::out_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 lo reinicializará.
*this a la dirección del objeto Pointer almacenado.*this a la dirección de un objeto void*. Esta función de conversión participa en la resolución de sobrecarga solo si 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 out_ptr_t, no se llamará a la otra, de lo contrario, el comportamiento no está definido.
Parámetros
(Ninguno)
Valor de retorno
Pointer almacenado.void* que cumpla con los requerimientos antes mencionados.Notas
Si el objeto al que apunta el valor devuelto no ha sido reescrito, es igual a nullptr.
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
Pointerpara ambas funciones de conversión, y (2) puede devolver directamente su dirección de reinterpret_cast avoid**.
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.
Ejemplo
| Esta sección está incompleta Razón: sin ejemplo |