我尝试执行以下操作:
QList<QString> a;
foreach(QString& s, a)
{
s += "s";
}
看起来它应该是合法的,但我最后抱怨它是cannot convert from 'const QString' to 'QString &'
。
为什么Qt foreach用const引用迭代?
答案 0 :(得分:21)
正如Qt Generic Containers Documentation:
所述Qt在进入foreach循环时会自动获取容器的副本。如果在迭代时修改容器,则不会影响循环。 (如果不修改容器,副本仍然会发生,但由于隐式共享复制容器非常快。)同样,声明变量是非const引用,以便修改当前项目该列表也不起作用。
它会制作副本,因为您可能希望从列表中删除项目或在循环时添加项目。缺点是你的用例不起作用。您将不得不迭代列表:
for (QList<QString>::iterator i = a.begin(); i != a.end(); ++i) {
(*i) += "s";
}
多点打字,但不要太多。
答案 1 :(得分:5)
或者您可以使用
QList<QString> a;
BOOST_FOREACH(QString& s, a)
{
s += "s";
}
答案 2 :(得分:2)
我相信Qt的foreach在迭代它之前会获取原始集合的临时副本,因此将非const引用修改为临时副本没有任何意义,它将无效。
答案 3 :(得分:2)
也许是你的情况:
namespace bl = boost::lambda;
std::for_each(a.begin(),a.end(),bl::_1 += "s");
答案 4 :(得分:1)
使用C ++ 11,Qt现在鼓励使用此标准for
语法而不是 Qt foreach :
QList<QString> a;
for(auto& s : a)
{
s += "s";
}