2013-11-21 70 views
4

這是否形成良好?是標準容器的迭代器DefaultConstructible?

int main() { 
    std::deque<int>::iterator x; // Or any container. 
} 

獎金的問題:這可能副本未初始化狀態

  • 什麼auto y = x;
  • … x = {};需要一個非顯式的默認構造函數呢?
  • x == y如果兩者都進行了值初始化(沒有默認初始化,如圖所示)?
+0

要回答這些獎勵問題:1.如果y = x'由於默認初始化的對象可能包含未初始化的成員而進行了值初始化,那麼它們纔是確定的;還參見第3條回答引用的條款; 2.'= {}'不能保證,因爲它不包含在DefaultConstructible中,我將根據C++標準提交缺陷報告; 3.看到對拉普茨答案的評論。 – Potatoswatter

回答

8

取決於您檢查的Iterator概念。

如果它是一個普通的Iterator,它只是被稱爲迭代器的絕對最小值,那麼答案是否定的,因爲它只能滿足CopyConstructible,CopyAssignable和Destructible的可構造性要求。 (§24.2.2/2)

然而,大多數容器迭代器都符合BidirectionalIterator的要求(除了std::forward_list,這是一個異常)。所有BidirectionalIterators也都符合ForwardIterator的要求,它符合InputIterator的要求(相當滿意)。

爲ForwardIterator明確狀態的要求:

一個類或指針類型X SATIS音響ES要求的向前 迭代如果

- X SATIS音響ES一個輸入迭代 的(要求24.2.3 ),

- X SATIS音響ES的可缺省要求 (17.6.3.1),

§24.2.5/ 1 in N3376

所以是的,這是一個有效的假設。

您可以在§24.2迭代器的要求,但他們很好地總結了cppreference

+1

啊。該條款還規定:「然而,值初始化迭代器可能會進行比較,並應與其他值相同類型的值初始化迭代器進行比較。」超! – Potatoswatter

5

是的,他們是,但它是不那麼明顯,因爲它似乎是第一次。

如果你看§24.2.2[iterator.iterators](n3485),Iterator(一般)不需要是DefaultConstructible。此外,查看§24.2.3[input.iterators]和$ 24.2.4 [output.iterators],InputIteratorOutputIterator也不是。

一旦我們得到§24.2.5[forward.iterators]雖然:

1/A類或指針類型X滿足正向迭代器的要求,如果

  • X滿足以輸入迭代器的要求(24.2.3),
  • X滿足DefaultConstructible要求(17.6.3。1) [...]

而且由於所有的標準集裝箱具有滿足ForwardIterator概念迭代器,它們都具有缺省構造的迭代器。