Почему я не могу использовать оператор & lt; на ‘std :: deque’?

Запустил cppcheck на моей кодовой базе и получил следующую ошибку:

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

Но итератор deque — это итератор с произвольным доступом, а итераторы с произвольным доступом поддерживают операторы неравенства. Так что же дает?

Пример:

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

Изменить: Эта ошибка была отправлена ​​и исправлена ​​с помощью cppcheck ticket # 5926.

5

Решение

Это ошибка в cppcheck.

Если мы посмотрим на код для правило stlBoundaries(), контейнеры, на которых он запускается:

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

Однако в дополнение к deque, priority_queue Также гарантировано наличие итераторов произвольного доступа.

Основанием для этого правила является то, что программисты могут случайно написать:

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

по аналогии с эквивалентным целочисленным индексом for цикл, и это может на самом деле скомпилировать для итераторов не с произвольным доступом с некоторым видом преобразования в указатель.

Это оригинальный элемент trac, в который добавлено правило: http://sourceforge.net/apps/trac/cppcheck/ticket/247 и этот билет освобожден vector: http://sourceforge.net/apps/trac/cppcheck/ticket/313

6

Другие решения


По вопросам рекламы [email protected]