Este fragmento de código:
int& func1()
{
int i;
i = 1;
return i;
}
no funcionará porque está devolviendo un alias (una referencia) a un objeto con una duración limitada al alcance de la llamada a la función. Eso significa que una vez que func1()regresa, int imuere, lo que hace que la referencia devuelta por la función no tenga valor porque ahora se refiere a un objeto que no existe.
int main()
{
int& p = func1();
/* p is garbage */
}
La segunda versión funciona porque la variable se asigna en la tienda gratuita, que no está vinculada a la duración de la llamada a la función. Sin embargo, usted es responsable deletede realizar las asignaciones 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
}
Normalmente, envolvería el puntero en alguna clase RAII y / o una función de fábrica para no tener quedelete hacerlo usted mismo.
En cualquier caso, puede devolver el valor en sí (aunque me doy cuenta de que el ejemplo que proporcionó probablemente fue artificial):
int func3()
{
return 1;
}
int main()
{
int v = func3();
// do whatever you want with the returned value
}
Tenga en cuenta que está perfectamente bien devolver objetos grandes de la misma manera que func3()devuelve valores primitivos porque casi todos los compiladores implementan actualmente alguna forma de optimización del valor de retorno :
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();
}
Curiosamente, vincular un temporal a una referencia constante es C ++ perfectamente legal .
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;