Namespaces
Variants

std:: inout_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 inout_ptr_t ;
(depuis C++23)

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

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

inout_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 de propriété.

Si Smart n'est pas un type pointeur, release ( ) est appelé au plus une fois sur l'objet adapté. Les implémentations peuvent appeler release ( ) dans le constructeur, ou avant la réinitialisation dans le destructeur si la valeur Pointer n'est pas nulle.

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) auquel une fonction externe accède pour la réinitialisation de propriété
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 .

Spécialisations

Contrairement à la plupart des modèles de classe dans la bibliothèque standard, les spécialisations définies par le programme de inout_ptr_t qui dépendent d'au moins un type défini par le programme ne sont pas tenues 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 inout_ptr_t
(fonction membre publique)
operator=
[supprimé] (C++23)
inout_ptr_t n'est pas assignable
(fonction membre publique)
réinitialise le pointeur intelligent adapté après avoir libéré sa propriété
(fonction membre publique)
convertit le inout_ptr_t en l'adresse du stockage pour la sortie
(fonction membre publique)

Fonctions non membres

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

Notes

inout_ptr_t s'attend à ce que les fonctions étrangères libèrent la propriété représentée par la valeur du Pointer pointé, puis la réinitialisent. Comme cette opération nécessite une propriété exclusive, l'utilisation avec std::shared_ptr est interdite.

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

if (int ec = foreign_resetter(std::inout_ptr(up)))
    return ec;

est approximativement équivalent à

T *raw_p = up.get();
up.release();
int ec = foreign_resetter(&raw_p);
up.reset(raw_p);
if (ec != 0)
    return ec;

Il n'est pas recommandé de créer un objet inout_ptr_t ayant une durée de stockage autre que la durée 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.

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) autonome std::out_ptr et std::inout_ptr

Exemple

Voir aussi

(C++23)
interagit avec les définisseurs de pointeurs étrangers et réinitialise un pointeur intelligent 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)