Atsortingbuer une valeur de retour de fonction à une référence c ++?

C’est une question en deux parties. Est-ce correct d’atsortingbuer la valeur de retour d’une fonction à une référence? Tel que

Foo FuncBar() { return Foo(); } // some where else Foo &myFoo = FuncBar(); 

Est-ce correct? Je crois comprendre que FuncBar() renvoie un object Foo et que myFoo fait maintenant référence.

Deuxième partie de la question. Est-ce une optimisation? Donc, si vous le faites souvent en boucle, il est préférable de le faire.

 Foo &myFoo = FuncBar(); 

ou

 Foo myFoo = FuncBar(); 

Et tenez compte des variables utilisées, l’utilisation de la référence ne nécessitera-t-elle pas des déréférences plus lentes?

 Foo &myFoo = FuncBar(); 

Ne comstackra pas. CA devrait etre:

 const Foo &myFoo = FuncBar(); 

car FuncBar() retourne un object temporaire (c’est-à-dire, rvalue) et seules les lvalues ​​peuvent être liées à des références non const.

Est-ce sûr?

Oui c’est sûr.

La norme C ++ spécifie que lier un object temporaire à une référence avec const allonge la durée de vie de la variable temporaire à la durée de vie de la référence elle-même, et évite ainsi ce qui serait autrement une erreur de référence pendante commune.


 Foo myFoo = FuncBar(); 

Est l’ initialisation de copie .
Il crée une copie de l’object renvoyé par FuncBar() , puis utilise cette copie pour initaliser myFoo . myFoo est un object séparé après l’exécution de l’instruction.

 const Foo &myFoo = FuncBar(); 

Lie le temporaire renvoyé par FuncBar() à la référence myFoo , notez que myFoo est simplement un alias du temporaire renvoyé et non un object séparé.

Vous n’êtes pas “assigner” à une référence, vous êtes lié à une référence.

Ce n’est approprié que lorsque le type est const et que le contexte est celui dans lequel l’extension de la durée de vie est automatique.

En général, lorsque Foo n’est pas un type const vos exemples ne devraient pas être compilés. Malheureusement, ils peuvent comstackr avec un compilateur commun, en raison des extensions de langage implémentées par ce compilateur. C’est une bonne idée d’essayer des exemples (et aussi du code ordinaire!) Avec au moins deux compilateurs.


ÉDITER: à titre d’exemple de travail d’enquête avant de poser une question , vous devez avoir compilé ce qui suit (ou très similaire) avec le niveau d’avertissement le plus élevé avec au moins deux compilateurs, définis et définis avec CONST .

 struct Bar {}; #ifdef CONST typedef Bar const Foo; #else typedef Bar Foo; #endif Foo FuncBar() { return Foo(); } int main() { // som where else Foo &myFoo = FuncBar(); } 

Si vous ne l’avez pas déjà fait, cela peut être une bonne idée de le faire maintenant.