Namespaces
Variants

std:: out_ptr_t

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)
Défini dans l'en-tête <memory>
template < class Smart, class Pointer, class ... Args >
class out_ptr_t ;
(depuis C++23)

out_ptr_t est utilisé pour adapter des types tels que les pointeurs intelligents pour des fonctions externes qui produisent leurs résultats via un paramètre Pointer* (généralement T** pour un type d'objet T ) ou un paramètre void ** .

out_ptr_t capture des arguments supplémentaires lors de sa construction, fournit un stockage pour le résultat auquel une telle fonction étrangère susmentionnée écrit, et finalement réinitialise l'objet Smart adapté avec le résultat et les arguments capturés lorsqu'il est détruit.

out_ptr_t se comporte comme s'il contenait les membres de données non statiques suivants :

  • une référence Smart& , qui est liée à l'objet adapté lors de la construction,
  • pour chaque T dans Args... , un membre de type T , qui est un argument capturé lors de la construction et utilisé pour la réinitialisation lors de la destruction, et
  • un sous-objet membre adapté au stockage d'un Pointer et fournissant un objet void * , où le Pointer ou l'objet void * est généralement exposé à une fonction externe pour la réinitialisation.

Les utilisateurs peuvent contrôler si chaque argument pour la réinitialisation est capturé par copie ou par référence, en spécifiant un type d'objet ou un type de référence dans Args... respectivement.

Table des matières

Paramètres du modèle

Smart - le type de l'objet (généralement un pointeur intelligent) à adapter
Pointer - type de l'objet (généralement un pointeur brut) vers lequel une fonction externe écrit son résultat
Args... - type des arguments capturés utilisés pour réinitialiser l'objet adapté
Exigences de type
-
Pointer doit satisfaire aux exigences de NullablePointer .
-
Le programme est mal formé si Smart est une spécialisation de std::shared_ptr et sizeof... ( Args ) == 0 .

Spécialisations

Contrairement à la plupart des modèles de classe dans la bibliothèque standard, les spécialisations définies par le programme de out_ptr_t qui dépendent d'au moins un type défini par le programme n'ont pas besoin de satisfaire aux exigences du modèle principal.

Cette licence permet à une spécialisation définie par le programme d'exposer le pointeur brut stocké dans un pointeur intelligent non standard à des fonctions externes.

Fonctions membres

construit un out_ptr_t
(fonction membre publique)
operator=
[supprimé] (C++23)
out_ptr_t n'est pas assignable
(fonction membre publique)
réinitialise le pointeur intelligent adapté
(fonction membre publique)
convertit le out_ptr_t en l'adresse du stockage pour la sortie
(fonction membre publique)

Fonctions non membres

(C++23)
crée un out_ptr_t avec un pointeur intelligent associé et des arguments de réinitialisation
(modèle de fonction)

Notes

out_ptr_t s'attend à ce que les fonctions étrangères n'utilisent pas la valeur du pointeur Pointer , et seulement le réinitialisent. La valeur du pointeur intelligent avant l'adaptation n'est pas utilisée.

L'utilisation typique de out_ptr_t consiste à créer ses objets temporaires via std::out_ptr , ce qui réinitialise immédiatement le pointeur intelligent adapté. Par exemple, étant donnée une fonction mutatrice et un pointeur intelligent de type approprié déclarés avec int foreign_setter ( T ** ) ; et std:: unique_ptr < T, D > up ; respectivement,

int foreign_setter(T**);
std::unique_ptr<T, D> up;
if (int ec = foreign_setter(std::out_ptr(up)))
    return ec;

est approximativement équivalent à

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;
Le code C++ n'a pas été traduit car il se trouve dans des balises `
` et contient des termes spécifiques au C++ qui doivent être préservés. La structure HTML et les attributs ont été maintenus intacts conformément aux instructions.

Il n'est pas recommandé de créer un objet out_ptr_t ayant une durée de stockage autre que la durée de stockage automatique, car un tel code est susceptible de produire des références pendantes et d'entraîner un comportement indéfini lors de la destruction.

out_ptr_t interdit l'utilisation qui réinitialiserait un std::shared_ptr sans spécifier un suppresseur, car cela appellerait std::shared_ptr::reset et remplacerait ultérieurement un suppresseur personnalisé.

Les arguments capturés sont généralement regroupés dans un std:: tuple < Args... > . Les implémentations peuvent utiliser différents mécanismes pour fournir l'objet Pointer ou void * qu'elles doivent contenir.

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_out_ptr 202106L (C++23) std::out_ptr , std::inout_ptr
202311L (C++26) version autonome de std::out_ptr et std::inout_ptr

Exemple

Voir aussi

interagit avec les définisseurs de pointeurs étrangers, obtient la valeur initiale du pointeur depuis un pointeur intelligent et le réinitialise lors de la destruction
(modèle de classe)
(C++11)
pointeur intelligent avec sémantique de propriété exclusive d'objet
(modèle de classe)
(C++11)
pointeur intelligent avec sémantique de propriété partagée d'objet
(modèle de classe)