Я знаю, что в общем случае время жизни временного в цикле for
на основе диапазона распространяется на весь цикл (я читал C++11: The range-based for statement: "range-init" lifetime?). Поэтому делать такие вещи, как это, как правило, в порядке:временный объект в диапазоне от
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;
}
Теперь мой вопрос: я делаю что-то тупую в первом случае, в результате чего, например, Неопределенное поведение (у меня недостаточно опыта чтения стандарта C++, чтобы ответить на это для себя)? Или это проблема с тем, как я использую QList
или как реализован QList
?
Спасибо за разъяснение. И глупо мне, конечно, я должен был использовать список инициализации в первую очередь - я как-то просто не думал об этом. Вероятно, из-за примеров Qt всегда используется '<<' для подобных случаев. –
Хорошо, похоже, что поддержка C++ 11 доступна только в Qt 4.8 и более поздних версиях. Но для таких случаев я могу легко использовать контейнеры из стандартной библиотеки. –
Может ли эта проблема быть обойдена путем литья в 'QList const &' (т.write 'for (auto i: static_cast const &> (QList {} << 1 << 2 << 3))')? Таким образом, он будет привязан к константной ссылке в инициализации цикла 'for', если я правильно прочитал § 6.5.5, и это, в свою очередь, расширит временное время жизни до объема цикла. –