为什么我不能在"std::d eque"上使用运算符<?

Why can't I use operator< on 'std::deque'?

本文关键字:运算符 lt eque 不能 std 为什么      更新时间:2023-10-16

在我的代码库上运行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;
}

编辑:这个bug是通过cppcheck ticket #5926提交并修复的。

这是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循环,这实际上可以编译为具有某种指针转换的非随机访问迭代器。

这是原始的跟踪项,添加了规则:http://sourceforge.net/apps/trac/cppcheck/ticket/247和此票豁免vector: http://sourceforge.net/apps/trac/cppcheck/ticket/313