Qt的文档说明以下内容:


// 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)
    ...

如果使用“错误”方法会怎样?

最佳答案

splitter->sizes()的两次调用产生了容器的两个不同拷贝。由于begin()来自一个,而end()来自另一个,所以它们不构成有效范围。然后,该循环将从第一个容器的末尾移入未定义行为的区域。

基于范围的循环虽然可以正常工作:for (int size: splitter->sizes()) { ... }

关于c++ - 在隐式共享容器上使用迭代器时,为什么必须先进行复制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39275770/

10-11 19:02