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) (depuis C++23)
operator void ** ( ) const noexcept ;
(2) (depuis C++23)

Expose l'adresse d'un Pointer ou d'un objet void * à une fonction externe qui va généralement le réinitialiser.

1) Convertit * this en l'adresse de l'objet Pointer stocké.
2) Convertit * this en l'adresse d'un objet void * . Cette fonction de conversion participe à la résolution de surcharge uniquement si Pointer n'est pas identique à void * , et le programme est mal formé si Pointer n'est pas un type pointeur.
La valeur initiale de l'objet void * est égale à la valeur de l'objet Pointer stocké converti en void * , et toute modification de celui-ci affecte la valeur Pointer utilisée dans le destructeur . L'accès à l'objet void * en dehors de la durée de vie de * this a un comportement indéfini.

Une fois que l'une de ces deux fonctions de conversion a été appelée sur un objet out_ptr_t , l'autre ne doit pas être appelée sur celui-ci, sinon, le comportement est indéfini.

Table des matières

Paramètres

(aucun)

Valeur de retour

1) L'adresse de l'objet Pointer stocké.
2) L'adresse de l'objet void * qui satisfait aux exigences mentionnées précédemment.

Notes

Si l'objet pointé par la valeur de retour n'a pas été réécrit, il est égal à nullptr .

Sur les implémentations courantes, la représentation objet de chaque Pointer qui est un type pointeur est compatible avec celle de void * , et par conséquent ces implémentations stockent typiquement l'objet void * dans le stockage de l'objet Pointer , sans besoin de stockage supplémentaire :

  • Si l'implémentation active l'analyse d'alias basée sur les types (qui repose sur la règle de strict aliasing ), un sous-objet membre std:: byte [ sizeof ( void * ) ] correctement aligné peut être utilisé, et les deux fonctions de conversion retournent l'adresse d'objets implicitement créés dans le tableau.
  • Sinon, un sous-objet membre Pointer peut être utilisé pour les deux fonctions de conversion, et (2) peut retourner directement son adresse reinterpret_cast en void ** .

Si Pointer est un type pointeur dont la représentation objet est incompatible avec celle de void * , un indicateur bool supplémentaire peut être nécessaire pour enregistrer si (1) (ou (2) ) a été appelé.

Exemple