versiones existentes dev compiler c++ c++11

existentes - dev c++



C++ 11: El enunciado basado en rango para: "range-init". (2)

¿Es correcto este razonamiento? ¿Si no, porque no?

Es correcto hasta este punto:

Y así, el valor de retorno temporal de boo () se destruye al final de la declaración "auto && r = boo ()" [...]

La vinculación de un temporal a una referencia extiende su vida útil a la de la referencia. Por lo tanto, lo temporal dura todo el bucle (por eso también hay un conjunto adicional de {} alrededor de toda la construcción: para limitar correctamente la vida útil de ese temporal).

Esto es de acuerdo con el párrafo 5 de §12.2 de la norma C ++:

El segundo contexto es cuando una referencia está vinculada a un temporal. El temporal al que se enlaza la referencia o el temporal que es el objeto completo de un subobjeto al que se enlaza la referencia persiste durante toda la vida útil de la referencia, excepto:

[varias excepciones que no aplican aquí]

Esta es una propiedad interesante que permite abusar del bucle de rango para cosas que no son de alcance: http://ideone.com/QAXNf

En el último estándar de C ++ implica que:

for (foo : bar) baz;

es equivalente a:

{ auto && r = bar; for ( auto it = r.begin(), end = r.end(); it != end; ++it ) { foo = *it; baz; } }

Cuando la barra de lo anterior es una llamada de función que devuelve una colección, por ejemplo:

vector<string> boo();

es decir

for (auto bo : boo()) ...

¿No se convierte la línea en:

auto&& r = boo(); ...

Y así, el valor de retorno temporal de boo () se destruye al final de la declaración "auto && r = boo ()", y luego r es una referencia pendiente en la entrada del bucle. ?? ¿Es correcto este razonamiento? ¿Si no, porque no?


El razonamiento no es correcto porque boo devuelve un objeto temporal por valor. Vincular este objeto temporal a una referencia implica que la vida útil del temporal se prolonga. Cotización estándar (§ 12.2 / 5):

[...] El temporal al que se vincula la referencia o el temporal que es el objeto completo de un subobjeto al que la referencia está vinculada persiste durante toda la vida útil de la referencia [...]

El razonamiento sería correcto si boo devolviera una referencia. Un ejemplo de una expresión que devuelve una referencia a un temporal es string("a") += string("b") ; El uso de este valor en un bucle for basado en rango da lugar a un comportamiento indefinido.