Pregunta devolver por valor asignado a la referencia constante


Estaba arreglando otro error en algún código y encontré un código que habría pensado que era un error; sin embargo, este código se compila bajo gcc 4.4, 4.5 y 4.6 y parece funcionar como "esperado". ¿Alguien puede decirme si esto es válido c ++?

struct foo {
     int bar;
};

foo myfunction(foo const &orig) {
    foo fooOnStack = orig;
    fooOnStack.bar *= 100;
    return fooOnStack;
}

void myOtherFunction(foo const &orig) {
    foo const &retFoo = myfunction();
    // perhaps do some tests on retFoo.bar ...
}

Si esto es válido c ++, ¿alguien sabe la razón detrás de esto es legal?


13
2017-09-07 21:50


origen


Respuestas:


Sí, esto es legal C ++. La formación de una referencia a const a un temporal extiende la vida útil del temporal a la duración de la referencia.


26
2017-09-07 21:52



Creo que todavía debes tener cuidado. Tengo un caso donde g ++ - 4.9 con C ++ 11 y tipos Eigen complicados no respeta esto (elimina datos en el temporal devuelto aunque se supone que su vida útil se extiende). Por lo tanto, a pesar de que podría ser legal, debería marcarse como dudoso a menos que haya una buena razón para ello.

Además, dado que C ++ 11 DEBE asignar el temporal en el sitio de la llamada si se devuelve por valor, su utilidad es tal vez menor de lo que solía ser si está utilizando el último estándar.


-1
2018-04-12 12:39