Este snippet de código:
int& func1()
{
int i;
i = 1;
return i;
}
não funcionará porque você está retornando um alias (uma referência) para um objeto com uma vida útil limitada ao escopo da chamada de função. Isso significa que uma vez que func1()retorna, int imorre, tornando a referência retornada da função inútil porque agora se refere a um objeto que não existe.
int main()
{
int& p = func1();
/* p is garbage */
}
A segunda versão funciona porque a variável é alocada no armazenamento gratuito, o que não é limitado ao tempo de vida da chamada de função. No entanto, você é responsável por deletefazer o envio 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, você envolveria o ponteiro em alguma classe RAII e / ou uma função de fábrica para que não precisasse fazer deleteisso sozinho.
Em qualquer caso, você pode simplesmente retornar o valor em si (embora eu saiba que o exemplo que você forneceu provavelmente foi inventado):
int func3()
{
return 1;
}
int main()
{
int v = func3();
// do whatever you want with the returned value
}
Observe que é perfeitamente normal retornar objetos grandes da mesma forma que func3()retorna valores primitivos porque quase todo compilador hoje em dia implementa alguma forma de otimização de 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 um temporário a uma referência const é perfeitamente C ++ 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;