Há algo de errado em retornar valores padrão construídos?

Suponha que eu tenha o seguinte código:

class some_class{};

some_class some_function()
{
    return some_class();
}

Isso parece funcionar muito bem e me poupa o trabalho de ter que declarar uma variável apenas para gerar um valor de retorno. Mas acho que nunca vi isso em nenhum tipo de tutorial ou referência. Isso é uma coisa específica do compilador (visual C ++)? Ou isso está fazendo algo errado?

0
adicionado editado
Visualizações: 1

6 Respostas

É válido, mas o desempenho pode não ser ideal dependendo de como é chamado.

Por exemplo:

A a;
a = fn();

e

A a = fn();

não são os mesmos.

In the first case the default constructor is called, ethen the assignment operator is invoked on a which requires a temporary variable to be constructed.

No segundo caso, o construtor de cópia é usado.

An intelligent enough compiler will work out what optimizations are possible. But, if the copy constructor is user supplied then I don't see how the compiler can optimize out the temporary variable. It has to invoke the copy constructor, eto do that it has to have another instance.

0
adicionado
O padrão permite explicitamente que o compilador elimine o construtor de cópia.
adicionado o autor Daniel James, fonte

Não, isso é perfeitamente válido. Isso também será mais eficiente, pois o compilador pode realmente otimizar o temporário.

0
adicionado
Na verdade, os compiladores modernos são frequentemente capazes de eliminar uma variável denominada que é retornada
adicionado o autor Nemanja Trifunovic, fonte

Isso é perfeitamente legal C ++ e qualquer compilador deve aceitá-lo. O que faz você pensar que pode estar fazendo algo errado?

0
adicionado
É só que eu nunca vi realmente usado em qualquer lugar na minha experiência limitada com C ++.
adicionado o autor Jason Baker, fonte
Justo. Definitivamente use-o, se não há razão para usar uma variável temporária, então você não precisa!
adicionado o autor Greg Hewgill, fonte

A diferença entre o exemplo de Rob Walker é chamada de Return Value Optimization (RVO), se você quiser pesquisar no Google.

Aliás, se você quiser que seu objeto seja retornado da maneira mais eficiente, crie o objeto no heap (ou seja, via novo) usando um shared_ptr e retorne um shared_ptr. O ponteiro é retornado e a referência é contada corretamente.

0
adicionado
De um modo geral, o RVO é mais eficiente do que usar shared_ptr, o objeto é criado no local no heap. Além disso, o shared_ptr tem que criar um objeto extra para armazenar a contagem.
adicionado o autor Daniel James, fonte

Isso é perfeitamente razoável C ++.

0
adicionado

Retornar objetos de uma chamada de função é o Padrão de Projeto "Fábrica" ​​e é usado extensivamente.

No entanto, você desejará ter cuidado ao retornar objetos ou ponteiros para objetos. O primeiro deles introduzirá você para copiar construtores/operadores de atribuição, o que pode ser uma dor.

0
adicionado