2016-09-01 13 views
9

dokumentacji QT mówi co następuje:Dlaczego należy wykonać kopię jako pierwszą w przypadku korzystania z iteratora na niejawnie udostępnionym kontenerze?

Dzięki niejawny dzielenia się, że jest bardzo tani za funkcją powrotu pojemnik na wartości. API Qt zawiera dziesiątki funkcji, które zwracają QList lub QStringList na wartość (np. QSplitter :: sizes()). Jeśli chcesz iterować po nich za pomocą iteratora STL, powinieneś zawsze wziąć kopię pojemnika i powtórzyć kopię. Na przykład:

// RIGHT 
const QList<int> sizes = splitter->sizes(); 
QList<int>::const_iterator i; 
for (i = sizes.begin(); i != sizes.end(); ++i) 
    ... 

// WRONG 
QList<int>::const_iterator i; 
for (i = splitter->sizes().begin(); 
     i != splitter->sizes().end(); ++i) 
    ... 

Co się stanie, jeśli stosowana jest „niewłaściwy” sposób?

Odpowiedz

12

Dwa połączenia z numerem splitter->sizes() generują dwie odrębne kopie kontenera. Od begin() pochodzi od jednego i end() od drugiego, nie stanowią one prawidłowego zakresu. Pętla następnie zszedłaby z końca pierwszego pojemnika do krainy niezdefiniowanych zachowań.

Pętla działająca w oparciu o zakres sprawdzi się dobrze: for (int size: splitter->sizes()) { ... }

Powiązane problemy