C++ – le problème des variables temporaires
Imaginons une fonction retournant un std::string par valeur:
std::string foo()
{
return std::string();
}
Lors du return, le compilateur crée une variable temporaire et celle-ci existe jusqu’à ce que la fonction se termine. Cela ne pose pas de problème si vous utilisez cette variable temporaire de cette manière:
std::string str = foo();
Une copie de la variable temporaire est assignée à str et lorsque la fonction se termine, la variable temporaire est détruite. Sa valeur a été transmise par copie à str. Tout va bien.
Un problème peut se présenter si vous assignez cette variable temporaire à une référence non constante:
const std::string& str = foo();
Le type de retour de foo() spécifie qu’un string est retourné par valeur. C’est à dire qu’une copie de la variable temporaire est créée et liée à votre référence et sa durée de vie est égale à celle de la référence. Il faut bien comprendre que la variable temporaire créée lors du return n’est pas la même que celle créée par copie et liée à la référence.
Par contre, lier une variable temporaire à une référence non constante n’est pas permis par la norme:
std::string& str = foo(); //illégal
La norme précise qu’une variable temporaire liée à une référence est une rvalue (expression à droite du signe =) et donc on ne peut pas lui assigner une valeur ni la modifier. En conséquence lier une variable temporaire à une référence non constante viole cette règle. Et ce n’est donc pas permis.
Le code de bonne pratique veut donc que vos références soient constantes par défaut. Ne les rendez non constantes que si c’est absolument nécessaire. Et si vraiment vous devez modifier une référence, pourquoi ne pas utiliser un pointeur?
Posted: novembre 17th, 2008 under C++.
Comments: 1
Tweet
Comment from Geoffray
Time: 12 février 2010, 23 h 27 min
Excellent article. Merci, il m’a bien aidé à me rafraîchir la mémoire en C++