Salut,

Envoyé par
Kaamui
Je ne penses pas que ce soit cela que dise Mr Loïc Joly. il dit que si ton constructeur est :
1 2 3 4
|
CTOR (...., const std::string& bondmnemonic="");
//ou
CTOR (...., std::string& bondmnemonic=""); |
(d'ailleurs std::string() pour initialiser sera plus Joly

)
Dans le premier cas les variables que tu passe en paramètre peuvent ne pas avoir été définies avant.
Dans le deuxième cas, pour que ça marche, il faut faire ceci :
1 2 3 4 5
|
std::string str("blabla");
std::string& r_str = str;
CTOR(..., r_str); |
(et maintenant je croise les doigts pour ne pas avoir dit de conneries
)
En fait, cela revient au même...
Le langage autorise la création d'une varialbe (anonyme) temporaire, uniquement lorsque l'argument est soit une copie, soit une référence constante.
La raison est simple : ainsi que le dit le terme, une variable temporaire anonyme est... anonyme et temporaire 
Comme elle est anonyme, il est impossible de réutiliser cette variable par la suite dans la fonction appelante, et, comme elle est temporaire, elle est détruite dés que l'on quitte la portée de la fonction à laquelle elle est passée en paramètre ( ce qui empêche, à nouveau, d'y avoir accès depuis la fonction appelante
) .
Il n'y a donc aucun sens à permettre qu'une référence sur une variable anonyme puisse etre modifiée dans la fonction appelante, étant donné... que toute modification apportée par la fonction sera d'office perdue 
Lorsque tu décides de fournir une valeur par défaut à un argument, c'est comme si tu disais au compilateur :
Tu dois t'attendre à ce que l'on te fournisse un objet de type XXX, mais, si on ne t'en donne pas, tu peux utiliser un objet qui aura été initialisé de cette manière, que tu devras créer toi meme pour l'utiliser dans la fonction.
Ce qui nous met, tu l'auras surement remarqué, exactement dans le cas d'une variable temporaire anonyme 
C'est la raison pour laquelle tu peux parfaitement écrire
ou
void foo(un_type const & )
voir meme
mais que tu ne peux fournir une valeur par défaut que pour les prototypes qui donnent l'assurance soit qu'aucune modification ne risque de devoir se répercuter dans la fonction appelante, à savoir
void foo(un_type const & arg=... )
ou
void foo(un_type arg=... )
Est-ce que c'est plus clair, maintenant?
Partager