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 que je peux réellement changer l’object sur lequel elles pointent? Ils ressemblent vraiment à une autre déclaration de variable simple. Pourquoi les utiliserais-je jamais? Ceci est un court exemple que je lance qui comstack et fonctionne sans erreurs:

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; } 

La réponse la plus claire Est-ce que «X & const x» a du 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 const à un X». Mais c’est redondant – les références sont toujours const, en ce sens que vous ne pouvez jamais réinstaller une référence pour la faire référence à un object différent. Jamais. Avec ou sans le const.

En d’autres termes, «X & const x» est équivalent à «X & x». Comme vous n’obtenez rien en ajoutant le const après le &, vous ne devriez pas l’append: cela confondra les gens – le const fera que certaines personnes pensent que le X est const, comme si vous aviez dit «const X & x».

L’énoncé icr=y; ne fait pas référence à y ; il assigne la valeur de y à la variable à laquelle icr réfère icr , i .

Les références sont insortingnsèquement const , c’est-à-dire que vous ne pouvez pas modifier ce à quoi elles se réfèrent. Il y a des «références const » qui sont vraiment des «références à const », c’est-à-dire que vous ne pouvez pas changer la valeur de l’object auquel elles se réfèrent. Ils sont déclarés const int& ou int const& plutôt int& const .

Qu’est-ce qu’une référence constante (pas une référence à une constante)
Une référence constante est en réalité une référence à une constante .

Une référence constante / référence à une constante est noté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’object type auquel Référence fait référence.
Par exemple:
En essayant de modifier la valeur (assigner 1 ) de la variable j par le biais de la référence const, i erreur:

atsortingbution d’une 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. Les références ne peuvent pas faire référence à une autre variable que celle à laquelle elles sont liées lors de l’initialisation.

La première instruction assigne la valeur y à i
Deuxième déclaration assigne la valeur 99 à i

Par “référence constante”, je pense 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 vers lesquelles il pointe), un pointeur sur les données constantes, ou les deux.

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 par l’utilisation d’un typedef-name ou d’un decltype-specifier , auquel cas les qualificateurs cv sont ignorés.

Cette règle a été présente dans toutes les versions standardisé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 doit 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 ne l’a déjà mentionné … personne n’a access à un compilateur?

Tout d’abord, je pense que int&const icr=i; est juste int& icr = i , le modificateur ‘const’ n’a aucun sens (cela signifie simplement que vous ne pouvez pas faire référence à une autre variable).

 const int x = 10; // int& const y = x; // Comstackr error here 

Deuxièmement, la référence constante signifie simplement que vous ne pouvez pas modifier la valeur de la variable par référence.

 const int x = 10; const int& y = x; //y = 20; // Comstackr error here 

Troisièmement, les références constantes peuvent lier une valeur correcte. Le compilateur créera une variable temporaire pour lier la référence.

 float x = 10; const int& y = x; const int& z = y + 10; cout << (long long)&x << endl; //print 348791766212 cout << (long long)&y << endl; //print 348791766276 cout << (long long)&z << endl; //print 348791766340