该文档只是states that it does,但没有解释原因:
对我来说,这似乎是一个自我强加的障碍,这使得Qt的foreach
比以前没有用的多了-现在您不能使用它来修改元素。
我听说boost的foreach
和新的C++ 11 for (auto iter : array)
不会执行复制(尽管我对它们中的任何一个都不熟悉)。
那么,复制背后的原理是什么?
最佳答案
Qt开发人员已经决定了用例,当您在循环中修改容器(例如在信号处理程序,A。k。a。插槽等)而不修改原始容器时,应避免出现意外情况。
使用信号时隙机制来跟踪是否修改了某些内容可能会很棘手。如果与该容器成员一起发出信号,则基本上取决于插槽。可以肯定的是,否则您总是需要进行外部复制。
另一个优点是,您可以将方法调用传递给第二个参数,而无需进行连续的重新评估,因为该拷贝将是第一次创建。如果您问我,这实际上是一个很好的功能,因为您经常希望遍历关联的数组键或值,例如myHash.keys()
或myHash.values()
。
您可能会争辩说,升压也具有信号时隙机制。是的,我认为这只是一种不同的处理方式。他们不必总是做同样的事情。 :-)
不同的人对API,样式等有不同的口味。毕竟,您掌握了所有工具,可以实现计划要使用的任何用例。
您也可能会争辩说它可能不是您想要的,而是应该进行显式复制。这很公平,您可以使用Boost或C++中的标准foreach达到最大程度。
在这里,拷贝没有性能问题,因为对于正常迭代而言,无需修改,写时复制(也称为隐式共享)就足够了。它有一些性能开销,但是可以忽略不计。
对于这种用例,正确的Qt语义将是使用迭代器设计模式。例如,Qt在“Java风格”之后的各处都有迭代器类。
关于c++ - 为什么Qt foreach创建容器的拷贝?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23612885/