2014-06-16 17 views
5

Ran cppcheck sulla mia base di codice e ha ricevuto il seguente errore:Perché non posso usare l'operatore <on 'std :: deque'?

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

Ma iteratore di una deque è un iteratore ad accesso casuale, e iteratori ad accesso casuale supportare gli operatori di disuguaglianza. Quindi cosa dà?

Esempio:

#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; 
} 

Edit: Questo bug è stato presentato e fissato tramite cppcheck ticket #5926.

+4

assicurarsi che si sta confrontando due iteratori dallo stesso contenitore. Non so fino a che punto si trova cppcheck, quindi potrebbe sempre lamentarsi a causa di questa possibilità. – ghostofstandardspast

+1

Mostrare la riga che attiva questo errore. – dasblinkenlight

+1

Abbiamo bisogno di vedere il codice di esempio per rispondere alla domanda –

risposta

6

È un bug in cppcheck.

Se guardiamo il codice per il rule stlBoundaries(), i contenitori si innesca on sono:

"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" 

Tuttavia, oltre a deque, priority_queue è garantita anche per avere iteratori ad accesso casuale.

Il razionale per questa regola è che i programmatori possano accidentalmente scrivere:

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

per analogia con l'equivalente intero indicizzati for anello, e questo potrebbe effettivamente compilare per iteratori non ad accesso casuale con una sorta di conversione al puntatore.

Questo è l'elemento originale trac che ha aggiunto la regola: http://sourceforge.net/apps/trac/cppcheck/ticket/247 e questo biglietto esentato vector: http://sourceforge.net/apps/trac/cppcheck/ticket/313

+1

Nota: non esiste un iteratore su un 'priority_queue' (questo è un adattatore del contenitore). –