¿Hay algo de malo en devolver los valores construidos por defecto?

Supongamos que tengo el siguiente código:

class some_class{};

some_class some_function()
{
    return some_class();
}

Esto parece funcionar bastante bien y me ahorra el problema de tener que declarar una variable solo para generar un valor de retorno. Pero no creo que haya visto esto en ningún tipo de tutorial o referencia. ¿Es esto algo específico del compilador (C ++ visual)? ¿O está haciendo algo mal?

0
agregado editado
Puntos de vista: 1

6 Respuestas

Es válido, pero el rendimiento puede no ser ideal dependiendo de cómo se llame.

Por ejemplo:

A a;
a = fn();

y

A a = fn();

no son lo mismo.

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

En el segundo caso, se usa el constructor de copia.

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, yto do that it has to have another instance.

0
agregado
El estándar permite explícitamente al compilador eludir el constructor de copia.
agregado el autor Daniel James, fuente

No, esto es perfectamente válido. Esto también será más eficiente ya que el compilador realmente puede optimizar el temporal.

0
agregado
De hecho, los compiladores modernos a menudo pueden opimize una variable nombrada que se devuelve
agregado el autor Nemanja Trifunovic, fuente

Esto es perfectamente legal C ++ y cualquier compilador debería aceptarlo. ¿Qué te hace pensar que podría estar haciendo algo mal?

0
agregado
Es solo que nunca lo había visto realmente usado en ninguna parte de mi limitada experiencia con C ++.
agregado el autor Jason Baker, fuente
Lo suficientemente justo. Definitivamente úsela, si no hay razón para usar una variable temporal, ¡entonces no es necesario!
agregado el autor Greg Hewgill, fuente

La diferencia entre el ejemplo de Rob Walker se llama Return Value Optimization (RVO) si desea buscarlo en Google.

A propósito, si desea asegurarse de que su objeto se devuelva de la manera más eficiente, cree el objeto en el montón (es decir, mediante nuevo) utilizando un shared_ptr y en su lugar, devuelva un shared_ptr. El puntero se devuelve y los recuentos de referencia correctamente.

0
agregado
En términos generales, RVO es más eficiente que usar shared_ptr, el objeto se crea en su lugar en el montón. Además, shared_ptr tiene que crear un objeto adicional para almacenar el conteo.
agregado el autor Daniel James, fuente

Eso es perfectamente razonable C ++.

0
agregado

La devolución de objetos desde una llamada de función es el patrón de diseño "de fábrica" ​​y se usa ampliamente.

Sin embargo, deberá tener cuidado ya sea que devuelva objetos o punteros a los objetos. El primero de estos le presentará copiar constructores/operadores de asignación, lo que puede ser un problema.

0
agregado