Cet extrait de code:
int& func1()
{
int i;
i = 1;
return i;
}
ne fonctionnera pas car vous renvoyez un alias (une référence) à un objet avec une durée de vie limitée à la portée de l'appel de fonction. Cela signifie qu'une fois func1()retourne, int imeurt, ce qui rend la référence retournée par la fonction sans valeur car elle fait maintenant référence à un objet qui n'existe pas.
int main()
{
int& p = func1();
/* p is garbage */
}
La deuxième version fonctionne car la variable est allouée sur le magasin gratuit, qui n'est pas lié à la durée de vie de l'appel de fonction. Cependant, vous êtes responsable de la deletesomme allouée int.
int* func2()
{
int* p;
p = new int;
*p = 1;
return p;
}
int main()
{
int* p = func2();
/* pointee still exists */
delete p; // get rid of it
}
En règle générale, vous encapsulez le pointeur dans une classe RAII et / ou une fonction d'usine afin que vous n'ayez pas à le deletefaire vous-même.
Dans les deux cas, vous pouvez simplement renvoyer la valeur elle-même (bien que je réalise que l'exemple que vous avez fourni était probablement artificiel):
int func3()
{
return 1;
}
int main()
{
int v = func3();
// do whatever you want with the returned value
}
Notez qu'il est parfaitement bien de renvoyer de gros objets de la même manière que func3()les valeurs primitives, car à peu près tous les compilateurs implémentent de nos jours une forme d' optimisation de la valeur de retour :
class big_object
{
public:
big_object(/* constructor arguments */);
~big_object();
big_object(const big_object& rhs);
big_object& operator=(const big_object& rhs);
/* public methods */
private:
/* data members */
};
big_object func4()
{
return big_object(/* constructor arguments */);
}
int main()
{
// no copy is actually made, if your compiler supports RVO
big_object o = func4();
}
Fait intéressant, lier un temporaire à une référence const est parfaitement légal en C ++ .
int main()
{
// This works! The returned temporary will last as long as the reference exists
const big_object& o = func4();
// This does *not* work! It's not legal C++ because reference is not const.
// big_object& o = func4();
}
int& i = * new int;