std:: atomic_ref
| 
           
           Défini dans l'en-tête
            
         
            
             <atomic>
            
           
           | 
         ||
| 
           
           
            
             template
            
            
             <
            
            
             class
            
            T
            
             >
            
             
         struct atomic_ref ;  | 
         (depuis C++20) | |
       La classe template
       
        std::atomic_ref
       
       applique des opérations atomiques à l'objet qu'elle référence.
      
       Pour la durée de vie de l'objet
       
        std::atomic_ref
       
       , l'objet qu'il référence est considéré comme un objet atomique. Si un thread écrit dans un objet atomique tandis qu'un autre thread le lit, le comportement est bien défini (voir le
       
        modèle de mémoire
       
       pour plus de détails sur les courses de données). De plus, les accès aux objets atomiques peuvent établir une synchronisation inter-threads et ordonner les accès mémoire non atomiques comme spécifié par
       
        
         std::memory_order
        
       
       .
      
       La durée de vie d'un objet doit excéder la durée de vie de toutes les
       
        std::atomic_ref
       
       qui référencent l'objet. Tant qu'une instance de
       
        std::atomic_ref
       
       référençant un objet existe, l'objet doit être accédé exclusivement par ces instances de
       
        std::atomic_ref
       
       . Aucun sous-objet d'un objet référencé par un objet
       
        std::atomic_ref
       
       ne peut être référencé simultanément par un autre objet
       
        std::atomic_ref
       
       .
      
       Les opérations atomiques appliquées à un objet via un
       
        std::atomic_ref
       
       sont atomiques par rapport aux opérations atomiques appliquées via tout autre
       
        std::atomic_ref
       
       référençant le même objet.
      
       Comme les
       
        références
       
       dans le langage de base, la constance est superficielle pour
       
        std::atomic_ref
       
       - il est possible de modifier la valeur référencée à travers un objet
       
        
         const
        
       
       
        std::atomic_ref
       
       .
      
Si l'une des conditions suivantes est satisfaite, le programme est mal formé :
- std:: is_trivially_copyable_v < T > est false .
 - 
        
         
is_always_lock_freeest false et std:: is_volatile_v < T > est true . 
       
        std::atomic_ref
       
       est
       
        
         CopyConstructible
        
       
       .
      
         Table des matières | 
       
Types imbriqués
| Type | Définition | 
         
          value_type
         
         | 
        std:: remove_cv_t < T > | 
         
          difference_type
         
         | 
        
         
  | 
       
Membres de données
| Membre | Description | 
         
         
         
          
           T
           
            *
           
          
         
         
          
           ptr
          
         
         | 
        
         le pointeur vers l'objet référencé
          ( membre objet d'exposition uniquement* )  | 
       
| 
          
           
            
             
              [static]
             
            
           
           
          | 
        
         indique que le type est toujours sans verrou
          (constante membre statique publique)  | 
       
| 
          
           
            
             
              [static]
             
            
           
           
          | 
        
         indique l'alignement requis d'un objet pour être référencé par
         
          atomic_ref
         
         (constante membre statique publique)  | 
       
Fonctions membres
         construit un objet
         
          atomic_ref
         
         (fonction membre publique)  | 
       |
         stocke une valeur dans l'objet référencé par un
         
          atomic_ref
         
         objet
         (fonction membre publique)  | 
       |
         vérifie si l'objet
         
          atomic_ref
         
         est sans verrou
         (fonction membre publique)  | 
       |
| 
         remplace atomiquement la valeur de l'objet référencé par un argument non atomique
          (fonction membre publique)  | 
       |
| 
         obtient atomiquement la valeur de l'objet référencé
          (fonction membre publique)  | 
       |
| 
         charge une valeur depuis l'objet référencé
          (fonction membre publique)  | 
       |
| 
         remplace atomiquement la valeur de l'objet référencé et obtient la valeur détenue précédemment
          (fonction membre publique)  | 
       |
| 
         compare atomiquement la valeur de l'objet référencé avec l'argument non atomique et effectue un échange atomique si égal ou un chargement atomique sinon
          (fonction membre publique)  | 
       |
| 
         bloque le thread jusqu'à notification et changement de la valeur atomique
          (fonction membre publique)  | 
       |
| 
         notifie au moins un thread en attente sur l'objet atomique
          (fonction membre publique)  | 
       |
| 
         notifie tous les threads bloqués en attente sur l'objet atomique
          (fonction membre publique)  | 
       |
| 
          
           
            
             
              (C++26)
             
            
           
           
          | 
        
         renvoie l'adresse de l'objet
          (fonction membre publique)  | 
       
         
          
           Fourni uniquement lorsque
           
         | 
       |
| 
         ajoute atomiquement l'argument à la valeur stockée dans l'objet référencé et obtient la valeur détenue précédemment
          (fonction membre publique)  | 
       |
| 
         soustrait atomiquement l'argument de la valeur stockée dans l'objet référencé et obtient la valeur détenue précédemment
          (fonction membre publique)  | 
       |
| 
         ajoute ou soustrait atomiquement de la valeur référencée
          (fonction membre publique)  | 
       |
         
          
           Fourni uniquement lorsque
           
         | 
       |
| 
          
           
            
             
              (C++26)
             
            
           
           
          | 
        
         effectue atomiquement
         
          
           std::max
          
         
         entre l'argument et la valeur de l'objet référencé et obtient la valeur détenue précédemment
          (fonction membre publique)  | 
       
| 
          
           
            
             
              (C++26)
             
            
           
           
          | 
        
         effectue atomiquement
         
          
           std::min
          
         
         entre l'argument et la valeur de l'objet référencé et obtient la valeur détenue précédemment
          (fonction membre publique)  | 
       
| 
         incrémente ou décrémente atomiquement l'objet référencé de un
          (fonction membre publique)  | 
       |
         
          
           Fourni uniquement lorsque
           
         | 
       |
| 
         effectue atomiquement un ET binaire entre l'argument et la valeur de l'objet référencé et obtient la valeur détenue précédemment
          (fonction membre publique)  | 
       |
| 
         effectue atomiquement un OU binaire entre l'argument et la valeur de l'objet référencé et obtient la valeur détenue précédemment
          (fonction membre publique)  | 
       |
| 
         effectue atomiquement un OU exclusif bit à bit entre l'argument et la valeur de l'objet référencé et obtient la valeur détenue précédemment
          (fonction membre publique)  | 
       |
| 
         effectue atomiquement un ET, OU, XOR bit à bit avec la valeur référencée
          (fonction membre publique)  | 
       |
Spécialisations
       La norme spécifie que
       
        std::atomic_ref
       
       possède les spécialisations suivantes :
      
| 
           
           
            
             template
            
            
             <>
            
             
         struct atomic_ref < /*integral-type*/ > ;  | 
         (1) | (depuis C++20) | 
| 
           
           
            
             template
            
            
             <>
            
             
         struct atomic_ref < /*floating-point-type*/ > ;  | 
         (2) | (depuis C++20) | 
| 
           
           
            
             template
            
            
             <
            
            
             class
            
            
             /*pointer-type*/
            
            
             >
            
             
         
             requires
             
              /* voir ci-dessous */
             
               | 
         (3) | (depuis C++20) | 
Notes
Les implémentations peuvent fusionner les spécialisations spécifiées. Par exemple, MSVC STL fusionne toutes celles-ci dans le modèle principal.
       Lorsque
       
        T
       
       est
       
        cv
       
       
        
         void
        
       
       ou un type de fonction,
       
        std
        
         ::
        
        
         atomic_ref
        
        
         <
        
        T
        
         *
        
        
         >
        
       
       (c'est-à-dire
       
        std
        
         ::
        
        
         atomic_ref
        
        
         <
        
        
         void
        
        
         *
        
        
         >
        
       
       ,
       
        std
        
         ::
        
        
         atomic_ref
        
        
         <
        
        
         int
        
        
         (
        
        
         *
        
        
         )
        
        
         (
        
        
         )
        
        
         >
        
       
       etc.) ne possède pas
       
        difference_type
       
       ni aucune opération nécessitant de l'arithmétique de pointeur
       
        
         ou de comparaison relationnelle
        
        
         
          (depuis C++26)
         
        
       
       .
      
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité | 
|---|---|---|---|
         
          
           __cpp_lib_atomic_ref
          
         
         | 
        
         
          
           201806L
          
         
         | 
        (C++20) | 
         
          std::atomic_ref
         
         | 
       
         
          
           __cpp_lib_constexpr_atomic
          
         
         | 
        
         
          
           202411L
          
         
         | 
        (C++26) | 
         
          
           constexpr
          
         
         
          
           std::atomic
          
         
         et
         
          std::atomic_ref
         
         | 
       
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement publié | Comportement corrigé | 
|---|---|---|---|
| 
         
          LWG 3508
         
          ( P3323R1 )  | 
        C++20 | 
         
          atomic_ref
          
           <
          
          T
          
           >
          
         
         avait des opérations non implémentables
          si 
          T
         
         est un type
         
          
           const
          
         
         ou un type pointeur-vers-non-objet
         | 
        
         ces opérations sont soit contraintes
          soit non fournies pour les 
          T
         
         inappropriés
         | 
       
Voir aussi
| 
          
           
            
             
              (C++11)
             
            
           
           
          | 
        
         Modèle de classe atomic et spécialisations pour les types booléens, entiers,
         
          
           virgule flottante,
          
          
           
            (depuis C++20)
           
          
         
         et pointeurs
          (modèle de classe)  |