Я знаю, что в целом время жизни временного в цикле for
на основе диапазона распространяется на весь цикл (я читал С++ 11: основанный на диапазоне для оператора: "время-init-время жизни"?). Поэтому делать такие вещи обычно хорошо:
for (auto &thingy : func_that_returns_eg_a_vector())
std::cout << thingy;
Теперь я спотыкаюсь о проблемах с памятью, когда пытаюсь сделать то, что, как я думал, похоже на контейнер Qt QList
:
#include <iostream>
#include <QList>
int main() {
for (auto i : QList<int>{} << 1 << 2 << 3)
std::cout << i << std::endl;
return 0;
}
Проблема заключается в том, что valgrind показывает недопустимый доступ к памяти где-то внутри класса QList
. Однако изменение примера, чтобы список сохранялся в переменной, дает правильный результат:
#include <iostream>
#include <QList>
int main() {
auto things = QList<int>{} << 1 << 2 << 3;
for (auto i : things)
std::cout << i << std::endl;
return 0;
}
Теперь мой вопрос: я делаю что-то немое в первом случае, в результате чего, например, undefined поведение (у меня недостаточно опыта чтения стандарта С++, чтобы ответить на это для себя)? Или это проблема с тем, как я использую QList
или как QList
реализовано?