Stocker la valeur de retour de la fonction dans la référence C ++

Est-il valide de stocker la valeur de retour d’un object dans une référence?

class A { ... }; A myFunction() { A myObject; return myObject; } //myObject goes out of scope here void mySecondFunction() { A& mySecondObject = myFunction(); } 

Est-il possible de faire cela afin d’éviter de copier myObject dans mySecondObject? myObject n’est plus nécessaire et doit être exactement le même que mySecondObject. En théorie, il serait donc plus rapide de transférer la propriété de l’object d’un object à un autre. (Ceci est également possible en utilisant le pointeur partagé boost mais cela a la surcharge du pointeur partagé.)

Merci d’avance.

Il n’est pas permis de lier le temporaire à une référence non-const, mais si vous faites votre constante const, vous prolongerez la durée de vie du temporaire, reportez-vous à cet article de Danny Kalev .

En bref:

 const A& mySecondObject = myFunction(); 

Vous pourriez être intéressé par l’ optimisation du retour par valeur effectuée par de nombreux compilateurs pour éviter d’appeler le constructeur de copie.

C’est possible avec une référence const.

myFunction renvoie par valeur, de sorte que la valeur retournée est un object temporaire Vous pouvez lier un temporaire à une référence const, et la durée de vie du temporaire est étendue à la durée de vie de la référence. Vous ne pouvez pas lier un temporaire à une référence non-const (malheureusement).

La valeur de retour de myFunction peut être une copie de myObject . Du côté positif, elision du constructeur de copie (ou “optimisation de la valeur de retour nommée” dans ce cas) permet au compilateur de construire myObject directement dans le temporaire qui est la valeur de retour de myFunction , probablement située quelque part sur la stack du code appelant. Si cela se produit, alors lorsque myObject devient hors de scope, l’object n’est pas réellement détruit. L’optimisation est généralement mise en œuvre – par exemple, GCC (généralement?) Le fait même sans indicateur d’optimisation.

Copy ctor elision permet également au compilateur d’éviter toute copie si vous l’avez fait:

 A mySecondObject = myFunction(); 

Cela nécessite l’application des deux types légaux d’élément de contrôle de copie: (1) renvoyer une valeur nommée à partir d’une fonction et (2) initialiser un object à partir d’un temporaire.