Qt的文档说明如下:
由于隐式共享,函数返回每个值的容器非常便宜。 Qt API包含许多函数,每个值返回一个QList或QStringList(例如,QSplitter :: sizes())。如果要使用STL迭代器迭代这些,则应始终获取容器的副本并遍历副本。例如:
// RIGHT
const QList<int> sizes = splitter->sizes();
QList<int>::const_iterator i;
for (i = sizes.begin(); i != sizes.end(); ++i)
...
// WRONG
QList<int>::const_iterator i;
for (i = splitter->sizes().begin();
i != splitter->sizes().end(); ++i)
...
如果应用'错误'方法会发生什么?
答案 0 :(得分:12)
对splitter->sizes()
的两次调用产生两个不同的容器副本。由于begin()
来自另一个end()
而另一个来自for (int size: splitter->sizes()) { ... }
,因此它们不会形成有效范围。然后循环将从第一个容器的末端走出,进入未定义行为的土地。
基于范围的循环可以正常工作:{{1}}