Référence et constant

C++ compréhension d'erreur

a marqué ce sujet comme résolu.

Bonjour, J’ai cherché à comprendre le fonctionnement des références et des pointeurs. Et il s’avère que je ne comprends pas ce cas :

Code

int f1(int& x) { return x; } int f2(const int& x) { return x; }

int main(void) { int a = 5;

f1(2*a); // Erreur
f2(2*a); // Fonctionne

return 0;

}

Je ne comprends pas bien pourquoi le f2 fonctionne dans ce cas là mais pas le f1. f2 ne devrait il pas avoir une erreur également? Merci d’avoir pris le temps de me lire !

+0 -0

Salut,

Des maigres souvenirs que j’en ai, une expression littérale (2*a ici) est forcément constante. Tu ne peux donc pas la passer en tant que référence non constante (qui serait par définition modifiable).

Sans référence il s’agirait d’un passage par copie et ça ne poserait donc pas de problème (la copie peut très bien être modifiable).

Le code lisible :

int f1(int& x) { return x; }
int f2(const int& x) { return x; }

int main(void) {
    int a = 5;
    
    f1(2*a); // Erreur
    f2(2*a); // Fonctionne
    
    return 0;
}

Des maigres souvenirs que j’en ai, une expression littérale (2*a ici) est forcément constante.

entwanne

Plutot parce que c’est une rvalue (~ un temporaire) et que les references non constantes acceptent que les lvalues.

value category reference category valide ?
rvalue mutable lvalue ref (T&) non
rvalue contant lvalue ref (T const&) oui
rvalue rvalue ref (T&&) oui
rvalue copy (T) oui
- - -
lvalue mutable lvalue ref (T&) oui
lvalue contant lvalue ref (T const&) oui
lvalue rvalue ref (T&&) non
lvalue copy (T) oui

(les constant rvalue ref sont osef en general)

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte