2009-10-21 13 views
11

cerco di fare quanto segue:Perché iterazione continua con un riferimento const?

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

che sembra che dovrebbe essere legittimo, ma io alla fine con un errore lamentando che esso cannot convert from 'const QString' to 'QString &'.

Perché il Qt foreach sta iterando con un riferimento const?

risposta

2

credo foreach Qt prende una copia temporanea della collezione originale prima iterazione su di esso, quindi non avrebbe alcun senso di avere un punto di riferimento non-const come modificare la copia temporanea non avrebbe alcun effetto.

21

Come spiegato sulla Qt Generic Containers Documentation:

Qt prende automaticamente una copia del contenitore quando entra in un ciclo foreach. Se si modifica il contenitore mentre si sta iterando, ciò non influirà sul ciclo. (Se non si modifica il contenitore, la copia viene comunque eseguita, ma grazie alla condivisione implicita la copia di un contenitore è molto veloce.) Allo stesso modo, dichiarare la variabile come riferimento non const, per modificare l'elemento corrente in l'elenco non funzionerà neanche.

Effettua una copia perché è possibile rimuovere un elemento dall'elenco o aggiungere elementi durante il ciclo, ad esempio. Il rovescio della medaglia è che il tuo caso d'uso non funzionerà. Sarà necessario scorrere l'elenco invece:

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

Un po 'più di battitura, ma non troppo di più.

+4

Minor nitpick: preferisco: per (QList :: iteratore i = a.begin(), end = a.end(); io! = fine; ...) – cheez

2

Forse per il vostro caso:

namespace bl = boost::lambda; 
std::for_each(a.begin(),a.end(),bl::_1 += "s"); 
+0

Usare Boost Lambda è sempre una buona cosa – blwy10

5

oppure è possibile utilizzare

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

Con C++ 11, Qt ora incoraggia questo standard for sintassi invece di foreach Qt:

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