为什么我不能使用operator <on'std :: deque'?

Eva*_*ose 5 c++ inequality deque

在我的代码库上运行cppcheck并收到以下错误:

Dangerous iterator comparison using operator< on 'std::deque'.
Run Code Online (Sandbox Code Playgroud)

但是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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:此错误已通过cppcheck ticket#5926提交并修复.

eca*_*mur 6

这是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"
Run Code Online (Sandbox Code Playgroud)

但是,除此之外deque,priority_queue还保证具有随机访问迭代器.

这条规则的基本原理是程序员可能会意外地写:

for (auto it = container.begin(); it < container.end(); ++it)
    ...
Run Code Online (Sandbox Code Playgroud)

与类似的整数索引for循环类比,这可能实际上编译为非随机访问迭代器与某种转换指针.

这是添加规则的原始trac项目:http://sourceforge.net/apps/trac/cppcheck/ticket/247并且此门票免除vector:http://sourceforge.net/apps/trac/cppcheck/ticket/313