2013-02-13 24 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相同:它们都是只读的。