2013-02-13 64 views
1

下面的代碼是在Ubuntu標準包中提供的類初始化程序列表。在這個迭代器和const_iterator中是相同類型的typedef。我只是想知道爲什麼我們希望爲不同類型的迭代器使用相同的typedef?理想的Iterator應該有typedef _E *迭代器。同一類型的多個typedef

// In the class initializer list: 
namespace std 
{ 
    /// initializer_list 
    template<class _E> 
    class initializer_list 
    { 
    public: 
     typedef _E    value_type; 
     typedef const _E&   reference; 
     typedef const _E&   const_reference; 
     typedef size_t   size_type; 
     typedef const _E*   iterator; 
     typedef const _E*   const_iterator; 

P.S:我不能如此,因爲這些領域是由滿足Container要求的任何類型的要求我給這個稱號

+0

我認爲':: reference'應該是'typedef _E&'not'typedef const _E&'。 – 0x499602D2 2013-02-13 17:44:52

+0

您不希望能夠修改initializer_list對象中的任何內容,但它需要:: reference才能滿足Container概念的要求,因此它們將其標記爲const。 – bstamour 2013-02-13 17:48:50

回答

5

爲了滿足Container的要求,iteratorconst_iterator這兩種類型都必須存在。許多算法和大量代碼都依賴於具有這兩種類型的容器。然而,iterator類型不一定是非const(可變)迭代器。在這種情況下,他們已經決定iteratorconst_iterator都是const(不可變)迭代器。

他們有兩個迭代器爲const的原因是他們顯然不希望你能夠更改initializer_list中的值。

作爲另一個例子,看看std::setiteratorconst_iterator類型也都是不變的迭代器。由於std::set包含有序元素,如果您能夠更改std::set的內容,則該排序將失效。爲了防止這種情況,兩種迭代器類型都是不可變的。

2

認爲合適的頭銜。恰巧在 std::initializer_list的情況下,iteratorconst_iterator是相同的。

0

這可能是因爲你不想改變存儲在初始化列表中的值。它們意味着要被傳遞給構造函數的臨時對象。

C++有一個(非正式的,現在)理想的概念,適用於泛型類型。 Container概念要求某些類型定義可用於您的對象。由於std :: initializer_list是一個容器,它需要:: iterator和:: const_iterator typedefs。然而,像std :: set一樣,你不想讓用戶修改initializer_list中的元素,所以:: iterator與:: const_iterator相同:它們都是隻讀的。