Почему foreach повторяется с константной ссылкой? - PullRequest
11 голосов
/ 21 октября 2009

Я пытаюсь сделать следующее:

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

Кажется, что это должно быть законно, но я получаю сообщение об ошибке с жалобой, что оно cannot convert from 'const QString' to 'QString &'.

Почему QtИтерация foreach с константной ссылкой?

Ответы [ 5 ]

21 голосов
/ 21 октября 2009

Как объяснено в документации Универсальные контейнеры Qt :

Qt автоматически берет копию контейнера, когда он входит в цикл foreach. Если вы измените контейнер во время итерации, это не повлияет на цикл. (Если вы не изменяете контейнер, копирование по-прежнему происходит, но благодаря неявному совместному использованию копирование контейнера выполняется очень быстро.) Аналогичным образом, объявление переменной как неконстантной ссылки для изменения текущего элемента в список также не будет работать.

Он делает копию, потому что вы можете удалить элемент из списка или добавить элементы, например, во время цикла. Недостатком является то, что ваш вариант использования не будет работать. Вместо этого вам придется перебирать список:

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

Немного больше печатать, но не слишком много.

5 голосов
/ 22 октября 2009

или вы можете использовать

QList<QString> a;
BOOST_FOREACH(QString& s, a)
{
   s += "s";
}
2 голосов
/ 21 октября 2009

Может быть, для вашего случая:

namespace bl = boost::lambda;
std::for_each(a.begin(),a.end(),bl::_1 += "s");
2 голосов
/ 21 октября 2009

Я полагаю, что forech в Qt берет временную копию исходной коллекции перед итерацией по ней, поэтому нет смысла иметь неконстантную ссылку, так как изменение временной копии не будет иметь никакого эффекта.

1 голос
/ 24 августа 2017

В C ++ 11 Qt теперь поддерживает этот стандартный синтаксис for вместо Qt foreach :

QList<QString> a;
for(auto& s : a)
{
    s += "s";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...