2009-07-27 87 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說

然而,值初始化的迭代器可以被比較,並應比較 等於相同類型的其它值初始化的迭代器。