web-dev-qa-db-fra.com

Qu'est-ce qu'une référence constante? (pas une référence à une constante)

Une question assez théorique ... Pourquoi les références constantes ne se comportent-elles pas de la même manière que les pointeurs constants et puis-je réellement changer l'objet? Cela ressemble vraiment à une autre déclaration de variable simple. Pourquoi devrais-je jamais les utiliser? Voici un court exemple que je lance qui compile et s'exécute sans erreur:

int main (){
    int i=0;
    int y=1;    
    int&const icr=i;
    icr=y;          // Can change the object it is pointing to so it's not like a const pointer...
    icr=99;         // Can assign another value but the value is not assigned to y...
    int x=9;
    icr=x;
    cout<<"icr: "<<icr<<", y:"<<y<<endl; 
}
50
Bat0u89

La réponse la plus claire .“X & const x” a-t-il un sens?

Non, c'est absurde

Pour savoir ce que signifie la déclaration ci-dessus, lisez-la de droite à gauche: "X est une référence constante à un X". Mais c'est redondant - références sont toujours constantes, dans le sens où vous ne pouvez jamais ré-insérer une référence pour le faire se référer à un objet différent. Jamais. Avec ou sans le const.

En d'autres termes, “X & const x” est fonctionnellement équivalent à “X & x” . Puisque vous ne gagnez rien en ajoutant le const après le &, vous ne devrait pas l’ajouter: cela dérouterait les gens - le const en fera les gens pensent que le X est constant, comme si vous aviez dit «Const X & x».

69
Bat0u89

L'instruction icr=y; ne fait pas que la référence fasse référence à y; il attribue la valeur de y à la variable à laquelle icr se réfère, i

Les références sont intrinsèquement const, c'est-à-dire que vous ne pouvez pas changer ce à quoi elles font référence. Il existe des 'références const' qui sont en réalité des 'références à const', c'est-à-dire que vous ne pouvez pas modifier la valeur de l'objet auquel elles font référence. Ils sont cependant déclarés const int& ou int const& plutôt que int& const.

45
mattnewport

Qu'est-ce qu'une référence constante (et non une référence à une constante)
A Référence de constante est en réalité une Référence à une constante

Une référence constante/Une référence à une constante est indiquée par: 

int const &i = j; //or Alternatively
const int &i = j;
i = 1;            //Compilation Error

En gros, cela signifie que vous ne pouvez pas modifier la valeur de l'objet type auquel la référence fait référence.
Par exemple:
Essayer de modifier la valeur (assigner 1) de la variable j par la référence const, i entraînera une erreur: 

affectation de la référence en lecture seule «i»


icr=y;          // Can change the object it is pointing to so it's not like a const pointer...
icr=99;

Ne change pas la référence, il assigne la valeur du type auquel la référence fait référence . Aucune référence ne peut être faite pour faire référence à une autre variable que celle à laquelle elles sont liées lors de l'initialisation.

Première instruction assigne la valeur y à i
Second statement assigne la valeur 99 à i

24
Alok Save

Ce code est mal formé:

int&const icr=i;

Référence: C++ 17 [dcl.ref]/1:

Les références qualifiées Cv sont mal formées sauf lorsque les qualificatifs cv sont introduits en utilisant un typedef-name ou decltype-specifier , auquel cas les qualificatifs cv sont ignorés.

Cette règle a été présente dans toutes les versions normalisées de C++. Parce que le code est mal formé:

  • vous ne devriez pas l'utiliser, et
  • il n'y a pas de comportement associé. 

Le compilateur devrait rejeter le programme; et si ce n'est pas le cas, le comportement de l'exécutable est complètement indéfini.

NB: Vous ne savez pas comment aucune des autres réponses n'a mentionné cela pour le moment ... personne n'a accès à un compilateur?

3
M.M

Par "référence constante", je suppose que vous voulez vraiment dire "référence à des données constantes". Les pointeurs, par contre, peuvent être un pointeur constant (le pointeur lui-même est constant, pas les données qu’il pointe), un pointeur sur des données constantes ou les deux. 

3
Poodlehat

Comme il est mentionné dans une autre réponse, une référence est intrinsèquement const.

int &ref = obj;

Une fois que vous avez initialisé une référence avec un objet, vous ne pouvez pas dissocier cette référence avec son objet auquel elle fait référence. Une référence fonctionne comme un alias.

Lorsque vous déclarez une référence const, ce n'est rien d'autre qu'une référence qui fait référence à un objet const.

const int &ref = obj;

Les phrases déclaratives ci-dessus telles que const et int déterminent les caractéristiques disponibles de l'objet qui seront référencées par la référence. Pour être plus clair, je veux vous montrer l'équivalent pointer d'une référence const;

const int *const ptr = &obj;

Ainsi, la ligne de code ci-dessus est équivalente à une référence const dans son fonctionnement. En outre , il y a un dernier point que je veux mentionner;

Une référence doit être initialisée uniquement avec un objet

Donc, quand vous faites cela, vous allez avoir une erreur;

int  &r = 0; // Error: a nonconst reference cannot be initialized to a literal

Cette règle a une exception. Si la référence est déclarée en tant que const, vous pouvez également l'initialiser avec des littéraux;

const int  &r = 0; // a valid approach
0
Ozan Yurtsever