多个typedef用于相同类型

时间:2013-02-13 17:39:05

标签: c++ stl typedef

下面的代码是Ubuntu标准包中提供的类初始化列表。在这个迭代器和const_iterator中是相同类型的typedef。我只是想知道为什么我们希望为不同类型的迭代器使用相同的typedef?理想情况下,对于Iterator,它应该有typedef _E * iterator。

// 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:我无法想到合适的头衔所以我给了这个头衔

3 个答案:

答案 0 :(得分:5)

要满足Container的要求,必须存在iteratorconst_iterator两种类型。许多算法和许多代码都依赖于具有这两种类型的容器。但是,iterator类型必须是非const(可变)迭代器。在这种情况下,他们已经确定iteratorconst_iterator都是const(不可变的)迭代器。

他们将迭代器都设为const的原因是因为他们显然不希望您能够更改initializer_list中的值。

作为另一个示例,请查看其iteratorconst_iterator类型也是常量迭代器的std::set。由于std::set包含有序元素,因此如果您能够更改std::set的内容,则该顺序将无效。为了防止这种情况,两个迭代器类型都是不可变的。

答案 1 :(得分:2)

因为满足Container要求的任何类型都需要这些字段。就是这样的情况恰好发生了 std::initializer_listiteratorconst_iterator相同。

答案 2 :(得分:0)

这可能是因为您不想更改存储在初始化列表中的值。它们意味着要被传递给构造函数的临时对象。

C ++有一个(非正式的,现在)理想的概念,适用于泛型类型。 Container概念要求某些typedef可用于您的对象。由于std :: initializer_list是一个容器,因此它需要:: iterator和:: const_iterator typedef。但是,像std :: set一样,你不想让用户修改initializer_list中的元素,因此:: iterator与:: const_iterator相同:它们都是只读的。