Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么foreach使用常量引用进行迭代?_C++_Qt_Foreach - Fatal编程技术网

C++ 为什么foreach使用常量引用进行迭代?

C++ 为什么foreach使用常量引用进行迭代?,c++,qt,foreach,C++,Qt,Foreach,我试着做到以下几点: QList<QString> a; foreach(QString& s, a) { s += "s"; } QList a; foreach(QString&s,a) { s+=“s”; } 这看起来应该是合法的,但我最后遇到一个错误,抱怨它无法从'const QString'转换为'QString&' 为什么Qt foreach使用常量引用进行迭代?我认为Qt的foreach在迭代原始集合之前会获取其临时副本,因此使用非常量引用没有任何意

我试着做到以下几点:

QList<QString> a;
foreach(QString& s, a)
{
    s += "s";
}
QList a;
foreach(QString&s,a)
{
s+=“s”;
}
这看起来应该是合法的,但我最后遇到一个错误,抱怨它
无法从'const QString'转换为'QString&'


为什么Qt foreach使用常量引用进行迭代?

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

如上所述:

当容器进入foreach循环时,Qt自动获取容器的副本。如果在迭代时修改容器,则不会影响循环。(如果不修改容器,则仍会进行复制,但由于隐式共享,复制容器的速度非常快。)同样,将变量声明为非常量引用以修改列表中的当前项也不起作用

它创建副本是因为您可能希望从列表中删除项目或在循环时添加项目。缺点是您的用例将无法工作。您将不得不迭代列表:

for (QList<QString>::iterator i = a.begin(); i != a.end(); ++i) { 
  (*i) += "s";
} 
for(QList::iterator i=a.begin();i!=a.end();++i){
(*i)+=“s”;
} 
再打字一点,但不要太多

也许对你的情况来说:

namespace bl = boost::lambda;
std::for_each(a.begin(),a.end(),bl::_1 += "s");
或者你可以使用

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

对于C++11,Qt现在鼓励将此标准
用于
语法,而不是Qt foreach:

QList a;
适用于(自动和s:a)
{
s+=“s”;
}

次要挑剔:我更喜欢:for(QList::iterator I=a.begin(),end=a.end();I!=end;…)
QList<QString> a;
for(auto& s : a)
{
    s += "s";
}