Question

Considérez ce qui suit:

int ival = 1.01;
int &rval = 1.01; // error: non-const reference to a const value.
int &rval = ival;

rval = 1.01;

La première affectation de & amp; rval à une valeur littérale échoue comme prévu. Si je commente cette ligne, le code est compilé et exécuté. Je comprends pourquoi l’initialisation a échoué, mais je ne comprends pas pourquoi l’affectation à rval fonctionne à la dernière ligne. Je ne pensais pas qu'il était permis d'attribuer une référence à une valeur littérale.

MODIFIER: Merci pour vos réponses rapides. Je suis tenté de supprimer ceci pour cacher ma honte, mais je pense que je vais le laisser ici pour que tout le monde puisse pointer du doigt et rire.

Pour ma propre défense, je travaille sur les exercices d'un livre (Guide d'introduction à C ++) et ce problème concerne la référence l'initialisation . Néanmoins, il est assez embarrassant d’avoir si complètement négligé le point de départ d’une référence. :)

Était-ce utile?

La solution

ival n'est pas une valeur littérale, 1.01 est la valeur littérale. Il a été copié dans ival , une variable qui peut très certainement se voir affecter des références à une autre variable.

Autres conseils

Une fois la référence initialisée, c’est un alias pour ce à quoi elle a été initialisée. Une fois qu'une référence est initialisée, vous ne pouvez plus changer le contenu de la référence. Cependant, vous pouvez modifier le "élément" auquel la référence fait référence (si la référence n'est pas const ).

La dernière ligne définit effectivement la variable ival sur 1.01 (à nouveau).

Voici quelque chose que vous pourriez être surpris de constater que vous pouvez faire si:

const int& x = 42;        // No error!

C ++ permet d’initialiser une référence const avec une valeur littérale (ou une autre valeur rvalue). En réalité, le compilateur crée un temporaire en copiant le RHS et initialise la référence pour faire référence à ce temporaire. Le compilateur veille à ce que le poste temporaire reste actif jusqu'à la fermeture de la portée (c'est-à-dire chaque fois que x sort de la portée dans ce cas).

Notez que cela ne fonctionne pas lors de l'initialisation des variables membres d'une classe.

Tricky hein? :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top