bonjour,
quel est la différence entre?:
etCode:
1
2
3 int& f(int x){ return x+1; }
Code:
1
2
3 int f(int x){ return x+1; }
merci
Version imprimable
bonjour,
quel est la différence entre?:
etCode:
1
2
3 int& f(int x){ return x+1; }
Code:
1
2
3 int f(int x){ return x+1; }
merci
La 1ere marche pas, la 2nd fonctionne mais je suppose qu'il faut argumenter.
La 2nd retourne un entier dont la valeur est le paramètre + 1. Rien à dire, cela marche et c'est OK (juste pas très utile mais je suppose que c'est pour l'exemple)
La 1ere retourne une référence (donc un pointeur) sur une variable temporaire x+1. Une fois que tu quittes ta fonction, cette valeur temporaire n'existe plus et donc ton pointeur pointe sur n'importe quoi. Quand on retourne une référence (c'est valable aussi pour un pointeur), il faut s'assurer de la durée de vie de la variable pointée.
je suis désolé, mais chez moi la premiere fonctionne.
et ca renvoie 3 quand je fais:
std::cout<<f(2);
Salut,
La première version renvoie une référence (comme l'a dit ram_000), mais il faut savoir qu'une référence est... un alias de l'objet en question (et non un pointeur).
Mais la variable x est détruite lorsque l'on quitte la portée de la fonction car, lorsque tu transmet x en paramètre, tu crée en réalité une variable temporaire propre à la fonction et nommée x.
Or, les règles de portées font que cette variable est détruite lorsque l'on quitte la portée de la fonction.
Dés lors, la première version renvoie un alias de quelque chose qui devient - de facto - invalide, et tu te place donc dans une situation dans laquelle tu pars vers des comportements indéfinis.
La seconde version par contre renvoie une variable qui continue d'exister ;)
sur mon compilateur, quand je compile ta fonction
J'obtiensCode:
1
2
3 int& f(int x){ return x+1; }
Donc je modifie un tout petit peu ton codeCitation:
error C2440: 'return'*: impossible de convertir de 'int' en 'int &'
et là j'obtiensCode:
1
2
3
4 int& f(int x){ int y = x+1; return y; }
Je passe outre ce warning et j'y vais:Citation:
warning C4172: retourne l'adresse d'une variable locale ou temporaire
Cela afficheCode:
1
2
3
4 int & var = f(4); std::cout<< "coucou" << std::endl; std::cout<<var << std::endl;
Ce qui est le signe que ta variable var pointe sur n'importe quoiCitation:
coucou
274156232
Pardon!!!!!!!!!!!
le programme que je compile est:
Code:
1
2
3
4 int& f(int x){ x=x+1; return x; }
et pourquoi? je suis d'accord avec ram-000Citation:
Je suis d'accord, c'est un alias au sens C++ du terme mais si on est curieux et qu'on regarde sous la robe (c'est pas beau de regarder sous les robes des filles ), c'est bien un pointeur.
C'est mieux mais c'est toujours le même problème.
Tu retourne un alias sur un objet qui n'existe plus à la fin de ta fonction puisque le paramètre est empilé sur la pile et dépilé/perdu lorsque tu quittes la fonction.
Image un truc genreJe sias, c'est pas beau de mélanger de C et du C++ mais j'ai pas mieux comme exemple rapide !!Code:std::cout << f(strlen("coucou"));