为什么foreach循环要使用const引用迭代?

13

我尝试做如下操作:

QList<QString> a;
foreach(QString& s, a)
{
    s += "s";
}

这似乎是合法的代码,但我最终遇到一个错误,指出它无法将 'const QString' 转换为 'QString &'。

为什么Qt中的foreach循环使用const引用进行迭代?

5个回答

21
根据Qt通用容器文档的解释:
Qt在进入foreach循环时会自动复制容器。如果在迭代过程中修改容器,这不会影响循环。(如果您不修改容器,则复制仍然会发生,但由于隐式共享,复制容器非常快。)同样,将变量声明为非const引用以修改列表中的当前项目也不起作用。
它会进行复制,因为你可能想要在循环过程中删除列表中的一个项目或添加项目。缺点是您的用例无法工作。您必须对列表进行迭代。
for (QList<QString>::iterator i = a.begin(); i != a.end(); ++i) { 
  (*i) += "s";
} 

需要多打一点字,但不需要太多。


4
细微之处:我更喜欢: for(QList<QString>::iterator i = a.begin(),end=a.end(); i != end; ...)的写法。 - Sohail

4
或者你可以使用。
QList<QString> a;
BOOST_FOREACH(QString& s, a)
{
   s += "s";
}

嗯,好的...当然,你可以使用不同的库!但希望你有一个非常好的理由同时使用Boost和Qt,这个理由超越了解决这个小问题! - BuvinJ

3

在C++11中,Qt现在鼓励使用标准的for语法,而不是Qt foreach

QList<QString> a;
for(auto& s : a)
{
    s += "s";
}

2
也许对于您的情况而言:
namespace bl = boost::lambda;
std::for_each(a.begin(),a.end(),bl::_1 += "s");

2
我相信Qt的foreach在迭代之前会对原始集合进行临时复制,因此将非const引用作为参数没有任何意义,因为修改临时复制品不会产生任何影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接