为什么foreach使用const引用进行迭代?

sho*_*osh 11 c++ foreach qt

我尝试执行以下操作:

QList<QString> a;
foreach(QString& s, a)
{
    s += "s";
}
Run Code Online (Sandbox Code Playgroud)

看起来它应该是合法的,但我最终抱怨它cannot convert from 'const QString' to 'QString &'.

为什么Qt foreach用const引用迭代?

jam*_*raa 21

正如Qt通用容器文档中所述:

Qt在进入foreach循环时自动获取容器的副本.如果在迭代时修改容器,则不会影响循环.(如果不修改容器,副本仍然会发生,但由于隐式共享复制容器非常快.)同样,声明变量是非const引用,以便修改当前项目该列表也不起作用.

它会创建一个副本,因为您可能希望从列表中删除项目或在循环时添加项目.缺点是你的用例不起作用.您将不得不迭代列表:

for (QList<QString>::iterator i = a.begin(); i != a.end(); ++i) { 
  (*i) += "s";
} 
Run Code Online (Sandbox Code Playgroud)

打字多一点,但不要太多.

  • 小挑剔:我更喜欢:for(QList <QString> :: iterator i = a.begin(),end = a.end(); i!= end; ...) (4认同)

Tim*_*imW 5

或者你可以使用

QList<QString> a;
BOOST_FOREACH(QString& s, a)
{
   s += "s";
}
Run Code Online (Sandbox Code Playgroud)


ato*_*ice 2

我相信 Qt 的 foreach 在迭代原始集合之前会获取原始集合的临时副本,因此拥有非常量引用是没有任何意义的,因为修改临时副本不会产生任何效果。