2011-09-07 9 views
12

Estaba arreglando otro error en algún código y me encontré con 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++?return por el valor asignado a la referencia de const

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 de ser legal?

+3

La lógica canónica se describe aquí: [GotW # 88: Un candidato para la "const más importante"] (http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for- the-most-important-const /). – ildjarn

+0

Además, el standardese que apoya que esto sea legal C++ está en C++ 03 §12.2/5. – ildjarn

+0

Gracias, hoy aprendí algo de C++. Tiene sentido, pero nunca lo había usado antes, y sabía que volver a una referencia no const no estaba permitido. – graphicsMan

Respuesta

24

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.

-1

Creo que todavía necesita 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.

Cuestiones relacionadas