Partager via


Initialisation des références

Les variables de type référence doivent être initialisées avec un objet du type à partir duquel le type référence est dérivé, ou avec un objet d'un type pouvant être converti en type à partir duquel le type référence est dérivé. Par exemple :

// initializing_references.cpp
int iVar;
long lVar;
int main() {
   long& LongRef1 = lVar;   // No conversion required.
   long& LongRef2 = iVar;   // C2440
   const long& LongRef3 = iVar;   // OK
   LongRef1 = 23L;   // Change lVar through a reference.
   LongRef2 = 11L;   // Change iVar through a reference.
   LongRef3 = 11L;   // C3892
}

La seule façon d'initialiser une référence avec un objet temporaire consiste à initialiser un objet constant temporaire. Une fois initialisée, une variable de type référence pointe toujours vers le même objet ; elle ne peut pas être modifiée pour pointer vers un autre objet.

Bien que la syntaxe puisse être identique, l'initialisation des variables de type référence et l'assignation à des variables de type référence sont sémantiquement différentes. Dans l'exemple précédent, les assignations qui modifient iVar et lVar ressemblent aux initialisations, mais leurs effets sont différents. L'initialisation spécifie l'objet vers lequel pointe la variable de type référence ; l'assignation assigne à l'objet référencé via la référence.

Étant donné que le passage d'un argument de type référence à une fonction et le retour d'une valeur de type référence à partir d'une fonction sont des initialisations, les arguments formels d'une fonction sont initialisés correctement, de même que les références retournées.

Les variables de type référence peuvent être déclarées sans initialiseurs uniquement dans les éléments suivants :

  • Déclarations de fonction (prototypes). Par exemple :

    int func( int& );
    
  • Déclarations de type retour de fonction. Par exemple :

    int& func( int& );
    
  • Déclaration d'un membre de classe de type référence. Par exemple :

    class c {
    public:
       int& i;
    };
    
  • Déclaration d'une variable spécifiée explicitement comme extern. Par exemple :

    extern int& iVal;
    

Lors de l'initialisation d'une variable de type référence, le compilateur utilise le graphique de décision représenté dans l'illustration suivante pour choisir entre la création d'une référence à un objet et la création d'un objet temporaire vers lequel pointe la référence.

Graphique de décision pour l'initialisation des types référence

Types référence d'initialisation des graphiques de décision

Les références aux types volatile (déclarés comme volatile typename**&** identifier) peuvent être initialisées avec des objets volatile du même type ou avec des objets qui n'ont pas été déclarés comme volatile. En revanche, elles ne peuvent pas être initialisées avec des objets const de ce type. De même, les références aux types const (déclarés comme const typename**&** identifier) peuvent être initialisées avec des objets const du même type (ou tout ce qui a une conversion vers ce type ou avec des objets qui n'ont pas été déclarés comme const). En revanche, elles ne peuvent pas être initialisées avec des objets volatile de ce type.

Les références qui ne sont pas qualifiées avec le mot clé const ou volatile peuvent être initialisées uniquement avec des objets déclarés ni comme const, ni comme volatile.

Voir aussi

Référence

Initialiseurs