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 ==()中包含断言以排除此用法。 (他们检查每个迭代器是否由同一个容器“拥有”,并且默认构造的迭代器没有容器。)这会暗示它不合法,或者可能是他们过于狂热。
答案 0 :(得分:15)
迭代器也可以有单数 与之无关的值 任何容器。 [例子:之后 未初始化的声明 指针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。相等的比较是未定义的,因此在某些实现中可能会有所不同。