Sé que, en general, la duración de un bucle temporal en un rango for
se extiende a todo el bucle (he leído C++11: The range-based for statement: "range-init" lifetime?). Por lo tanto haciendo cosas como esta es generalmente aceptable:objeto temporal en rango para
for (auto &thingy : func_that_returns_eg_a_vector())
std::cout << thingy;
Ahora estoy tropezando sobre problemas de memoria cuando trato de hacer algo que me pareció ser similar con QList
contenedor de Qt:
#include <iostream>
#include <QList>
int main() {
for (auto i : QList<int>{} << 1 << 2 << 3)
std::cout << i << std::endl;
return 0;
}
El problema aquí es que valgrind muestra acceso a la memoria no válida en algún lugar dentro de la clase QList
. Sin embargo, modificar el ejemplo para que la lista se almacena en la variable proporciona un resultado correcto:
#include <iostream>
#include <QList>
int main() {
auto things = QList<int>{} << 1 << 2 << 3;
for (auto i : things)
std::cout << i << std::endl;
return 0;
}
Ahora mi pregunta es: ¿Estoy haciendo algo tonto en el primer caso, por ejemplo, lo que resulta en comportamiento indefinido (no tengo suficiente experiencia leyendo el estándar C++ para poder responder esto por mi cuenta) ¿O es esto un problema con la forma en que uso QList
, o cómo se implementa QList
?
Gracias por la aclaración. Y estúpido de mí, por supuesto que debería haber usado una lista de inicialización en primer lugar, de alguna manera simplemente no pensé en ello. Probablemente debido a los ejemplos de Qt siempre usando '<<' para casos similares. –
Ah, bueno, parece que la compatibilidad con C++ 11 solo está disponible en Qt 4.8 y versiones posteriores. Pero en casos como este, puedo usar fácilmente los contenedores de la biblioteca estándar. –
¿Se podría eludir este problema lanzando a 'QList const &' (es decirescribiendo 'for (auto i: static_cast const &> (QList {} << 1 << 2 << 3))')? De esta forma, estaría ligado a una referencia constante en la inicialización del bucle 'for', si leo el §6.5.4 correctamente, y eso a su vez extendería la vida útil temporal al alcance del bucle. –