130 votes

Références lvalues non constantes

Pourquoi pouvez-vous faire cela

int a;
const double &m = a;

Mais quand vous faites ça

int a;
double &m = a;

vous obtenez une erreur ?

error: non-const lvalue reference to type 'double' cannot bind to a value of unrelated type 'int'

Edit :

Pour être plus précis, j'essaie de comprendre pourquoi les références non-const ne peuvent pas lier les objets temporaires.

107voto

Mahesh Points 20994

C'est parce qu'un temporaire ne peut pas se lier à une référence non-const.

double &m = a;

a est de type int et est en cours de conversion en double . Ainsi, un temporaire est créé. C'est également le cas pour les types définis par l'utilisateur.

Foo &obj = Foo(); // You will see the same error message.

Mais dans Visual Studio, cela fonctionne bien grâce à une extension de compilateur activée par défaut. Mais GCC se plaint.

48voto

xinnjie Points 138

Parce que faire des modifications sur un temporaire n'a aucun sens, le C++ ne veut pas que l'on lie une référence non-const à un temporaire. Par exemple :

int a;
double &m = a;  // caution:this does not work.

Et si ça marche ?
a est de type int et est converti en double. Un temporaire est donc créé.

Vous pouvez modifier m qui est lié à un temporaire, mais presque rien ne se passe. Après la modification, la variable a ne change pas (ce qui est pire ? Vous pourriez penser a a changé, ce qui peut causer des problèmes).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X