Y at-il quelque chose de mal à retourner les valeurs construites par défaut?

Supposons que j'ai le code suivant:

class some_class{};

some_class some_function()
{
    return some_class();
}

Cela semble plutôt bien fonctionner et me sauve la peine d'avoir à déclarer une variable juste pour faire une valeur de retour. Mais je ne pense pas avoir jamais vu ça dans un tutoriel ou une référence. Est-ce une chose spécifique au compilateur (visuel C ++)? Ou est-ce que quelque chose ne va pas?

0

6 Réponses

C'est valide, mais la performance peut ne pas être idéale selon la façon dont elle est appelée.

Par exemple:

A a;
a = fn();

et

A a = fn();

ne sont pas les mêmes.

In the first case the default constructor is called, etthen the assignment operator is invoked on a which requires a temporary variable to be constructed.

Dans le second cas, le constructeur de copie est utilisé.

An intelligent enough compiler will work out what optimizations are possible. But, if the copy constructor is user supplied then I don't see how the compiler can optimize out the temporary variable. It has to invoke the copy constructor, etto do that it has to have another instance.

0
ajouté
La norme autorise explicitement le compilateur à élider le constructeur de copie.
ajouté l'auteur Daniel James, source

Non, ceci est parfaitement valide. Cela sera également plus efficace car le compilateur est en mesure d'optimiser le temporaire.

0
ajouté
En fait, les compilateurs modernes sont souvent capables d'opimiser une variable nommée qui est retournée
ajouté l'auteur Nemanja Trifunovic, source

Ceci est parfaitement légal C ++ et tout compilateur devrait l'accepter. Qu'est-ce qui vous fait penser que cela pourrait faire quelque chose de mal?

0
ajouté
C'est juste que je ne l'ai jamais vraiment vu utilisé dans mon expérience limitée avec C ++.
ajouté l'auteur Jason Baker, source
C'est suffisant. Certainement l'utiliser, s'il n'y a pas de raison d'utiliser une variable temporaire, alors vous n'avez pas à le faire!
ajouté l'auteur Greg Hewgill, source

La différence entre l'exemple de Rob Walker est appelée Return Value Optimization (RVO) si vous voulez Google pour cela.

Incidemment, si vous voulez que votre objet soit retourné de la manière la plus efficace, créez l'objet sur le tas (ie via new) en utilisant un shared_ptr et renvoyez un shared_ptr à la place. Le pointeur est renvoyé et la référence compte correctement.

0
ajouté
D'une manière générale, RVO est plus efficace que l'utilisation de shared_ptr, l'objet est créé en place sur le tas. De plus, shared_ptr doit créer un objet supplémentaire pour stocker le compte.
ajouté l'auteur Daniel James, source

C'est parfaitement raisonnable C ++.

0
ajouté

Le retour d'objets d'un appel de fonction est le motif de conception "Usine" et est largement utilisé.

Cependant, vous devrez faire attention si vous renvoyez des objets, ou des pointeurs vers des objets. Le premier de ceux-ci vous présentera à copier les constructeurs/opérateurs d'affectation, ce qui peut être une douleur.

0
ajouté