【问题标题】:Is the second term in Qt's foreach evaluated only once?Qt 的 foreach 中的第二项是否只评估一次?
【发布时间】:2011-02-05 16:42:21
【问题描述】:

如果我有这个代码:

foreach (QListWidgetItem *ii, selectedItems()) {
    urls.push_back(ii->data(Qt::ToolTip).toString());
}

selectedItems() 会只被调用一次吗?

【问题讨论】:

标签: c++ qt


【解决方案1】:

是的。它将创建返回容器的副本,并使用它。 (参见Qt foreach keyword 文档)

相关:

  • 由于 Qt foreach 总是复制容器,因此最好与 QT 容器(即写时复制)或小型 STL 容器一起使用。
  • Boost's foreach 可以更好地处理这个问题,除非必要,否则会避免复制。

【讨论】:

  • 另一方面,复制允许修改循环中的原始容器而不会破坏任何内容。或者 Boost 也安全吗?从未实际使用过。
  • @Sergey:是的,但是在这种情况下我会制作一个明确的副本,因为根据我的经验,更常见的情况是我不想修改任何东西(即只是迭代),或者修改原来的容器。
  • true,但在 Qt 中,有时会在循环内隐式修改容器。例如,循环中可能有一些发出信号的方法调用,然后连接到该信号的某个插槽修改了容器。这并不像多线程那样糟糕,因为所有事情仍然发生在一个线程中,但是方法调用的顺序可能不是很明显。
  • @Sergey:是的。如果发生这种情况,最好有默认副本。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多