Main menu:

Site search

Categories

novembre 2008
L M M J V S D
 12
3456789
10111213141516
17181920212223
24252627282930

Archive

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?

Comments

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++