Namespaces
Variants

std::out_ptr_t<Smart,Pointer,Args...>:: operator Pointer*, std::out_ptr_t<Smart,Pointer,Args...>:: operator void**

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)
std::out_ptr_t
Member functions
out_ptr_t::operator Pointer* out_ptr_t::operator void**
Non-member functions
operator Pointer * ( ) const noexcept ;
(1) (desde C++23)
operator void ** ( ) const noexcept ;
(2) (desde C++23)

Expone la dirección de un Pointer o void * objeto a una función externa que generalmente lo reinicializará.

1) Convierte * this a la dirección del objeto Pointer almacenado.
2) Convierte * 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 igual a 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 almacenado Pointer convertido a void * , y cualquier modificación a este afecta al valor Pointer utilizado en el destructor . Acceder al objeto void * fuera del tiempo de vida de * this tiene comportamiento indefinido.

Una vez que una de estas dos funciones de conversión ha sido llamada en un objeto out_ptr_t , la otra no debe ser llamada en él; de lo contrario, el comportamiento es indefinido.

Contenidos

Parámetros

(ninguno)

Valor de retorno

1) La dirección del objeto Pointer almacenado.
2) La dirección del objeto void * que cumple con los requisitos mencionados anteriormente.

Notas

Si el objeto apuntado por el valor de retorno 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 típicamente almacenan el void * objeto dentro del almacenamiento para el Pointer objeto, sin necesidad de almacenamiento adicional:

  • Si la implementación habilita el análisis de alias basado en tipos (que depende de la regla estricta de aliasing ), puede utilizarse un subobjeto miembro std:: byte [ sizeof ( void * ) ] correctamente alineado, y ambas funciones de conversión devuelven la dirección de objetos creados implícitamente dentro del array.
  • De lo contrario, puede utilizarse un subobjeto miembro Pointer para ambas funciones de conversión, y (2) puede devolver directamente su dirección mediante reinterpret_cast a void ** .

Si Pointer es un tipo puntero cuya representación de objeto es incompatible con la de void * , puede ser necesario un indicador adicional bool para registrar si (1) (o (2) ) ha sido llamado.

Ejemplo