2009-07-27 68 views
11

C++标准是否说我应该能够比较两个默认构造的STL迭代器的相等性?默认构造的迭代器是否相等?比较默认构造的迭代器和运算符==

我想下面,使用std ::列表例如:

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的运算符==()中包含断言,排除了这种用法。 (他们检查每个迭代器是否由同一个容器“拥有”,并且默认构造的迭代器没有容器。)这会暗示它不合法,或者它们可能是过度热心的。

+0

`的boost ::可选的<性病::目录::迭代器>`浮现在脑海。 – MSalters 2009-07-28 07:48:17

回答

15

好吧,我会采取一个刺。 C++标准,第24.1节/ 5:

迭代器也可以具有不与任何 容器相关联的奇异 值。 [例如: 声明未初始化的 指针x(与int * x;一样)后,x必须始终假定为 指针的值为单数。 ]大多数 表达式的结果未定义为单数 值;唯一的例外是 将一个非奇异值分配给 迭代器,该迭代器保存单数值 值。

所以,不,他们不能比较。

1

我相信你应该通过范围的功能。

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

可能是真的,但不回答这个问题。 – 2009-07-27 19:31:18

+0

是的,只是我的2美分:) – AraK 2009-07-27 19:32:48

+1

我明白你在说什么,但语义真的需要一个单一的项目 - 很像std :: list :: erase()。我可能会滥用迭代器的概念;这就是我想要发现的东西。 – Adrian 2009-07-27 19:34:58

1

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

6

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

然而,值初始化的迭代器可以被比较,并应比较 等于相同类型的其它值初始化的迭代器。