一般に、範囲ベースのループの一時的なライフタイムはfor
ループ全体に拡張されることを知っています ( C++11: The range-based for statement: "range-init"lifetime?を読みました)。したがって、次のようなことを行うことは一般的に問題ありません。
for (auto &thingy : func_that_returns_eg_a_vector())
std::cout << thingy;
QList
Qtのコンテナと似ていると思ったことをしようとすると、メモリの問題につまずいています:
#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
に実装されているかの問題ですか?