将默认构造的迭代器与operator ==进行比较

时间:2009-07-27 19:24:43

标签: c++ visual-studio-2008 stl iterator

C ++标准是否说我应该能够比较两个默认构造的STL迭代器是否相等?默认构造的迭代器是否具有可比性?

我想要以下内容,例如使用std :: list:

void foo(const std::list<int>::iterator iter) {
    if (iter == std::list<int>::iterator()) {
        // Something
    }
}

std::list<int>::iterator i;
foo(i);

我想要的是迭代器的NULL值,但我不确定它是否合法。在Visual Studio 2008附带的STL实现中,它们在std :: list的operator ==()中包含断言以排除此用法。 (他们检查每个迭代器是否由同一个容器“拥有”,并且默认构造的迭代器没有容器。)这会暗示它不合法,或者可能是他们过于狂热。

4 个答案:

答案 0 :(得分:15)

好的,我会捅一下。 C ++标准,第24.1 / 5节:

  

迭代器也可以有单数   与之无关的值   任何容器。 [例子:之后   未初始化的声明   指针x(与int * x;一样),x必须   总是假设有一个单数   指针的值。 ]结果最多   表达式未定义为单数   值;唯一的例外是   将非奇异值赋值给   一个包含单数的迭代器   值。

所以,不,他们无法比较。

答案 1 :(得分:8)

这将在C ++ 14中发生变化。 [forward.iterators] N3936的24.2.5p2说

  

但是,可以比较值初始化的迭代器并进行比较   等于相同类型的其他值初始化迭代器。

答案 2 :(得分:1)

我相信你应该将范围传递给该函数。

void fun(std::list<int>::iterator beg, std::list<int>::iterator end)
{
    while(beg != end)
    {
        // do what you want here.
        beg++;
    }
}

答案 3 :(得分:1)

规范说默认构造函数的后置条件是迭代器是singular。相等的比较是未定义的,因此在某些实现中可能会有所不同。