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

Adr*_*ian 11 c++ iterator stl visual-studio-2008

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

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

小智 15

好的,我会采取刺.C++标准,第24.1/5节:

迭代器也可以具有与任何容器无关的奇异值.[示例:在声明未初始化的指针x(与int*x;一样)之后,必须始终假定x具有指针的奇异值.]对于奇异值,大多数表达式的结果都是未定义的; 唯一的例外是将非奇异值赋值给具有奇异值的迭代器.

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


Hym*_*sen 8

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

但是,可以比较值初始化的迭代器,并且它们应该与相同类型的其他值初始化迭代器进行比较.