2014-06-16 18 views
5

Ran cppcheck na mojej bazy kodu i otrzymała następujący błąd:Dlaczego nie mogę użyć operatora <on 'std :: deque'?

Dangerous iterator comparison using operator< on 'std::deque'. 

Ale iterator danej deque jest przypadkowa iterator dostępu i iteratory o dostępie swobodnym wspierać operatorów nierówności. Co daje?

przykład:

#include <deque> 

int main() 
{ 
    std::deque<int> d; 
    std::deque<int>::iterator di1 = d.begin(); 
    std::deque<int>::iterator di2 = d.end(); 

    if (di1 < di2) 
    { 
     // (error) Dangerous iterator comparison using operator< on 'std::deque'. 
    } 

    return 0; 
} 

Edycja: Błąd ten został przedstawiony i mocowany cppcheck ticket #5926.

+4

Upewnij się, że porównanie dwóch iteratory z tego samego pojemnika. Nie wiem, jak daleko sięga to cppcheck, więc może zawsze narzekać z powodu tej możliwości. – ghostofstandardspast

+1

Pokaż linię, która uruchamia ten błąd. – dasblinkenlight

+1

Potrzebujemy zobaczyć przykładowy kod, aby pomóc w odpowiedzi na pytanie: –

Odpowiedz

6

To błąd w cppcheck.

Jeśli spojrzymy na kod dla rule stlBoundaries() pojemniki wywołuje na to:

"bitset|deque|list|forward_list|map|multimap|multiset|priority_queue|queue|set|stack|hash_map|hash_multimap|hash_set|unordered_map|unordered_multimap|unordered_set|unordered_multiset" 

Jednak oprócz deque, priority_queue jest gwarantowana mieć losowych iteratory dostępu.

Uzasadnieniem dla tej reguły jest to, że programiści mogą przypadkowo napisać:

for (auto it = container.begin(); it < container.end(); ++it) 
    ... 

przez analogię do równoważnej liczby całkowitej indeksowane for pętli, a to może faktycznie kompilacji dla iteratorów non-random-access z jakimś konwersja do wskaźnika.

Jest to oryginalna pozycja trac że dodaje regułę: http://sourceforge.net/apps/trac/cppcheck/ticket/247 i ten bilet zwolnione vector: http://sourceforge.net/apps/trac/cppcheck/ticket/313

+1

Uwaga: nie ma iteratora na 'priority_queue' (jest to adapter kontenera). –

Powiązane problemy