同一类型的多个类型定义

multiple typedef for same type

本文关键字:类型 定义      更新时间:2023-10-16

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

// 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;

PS:我想不出合适的标题,所以我给了这个标题

为了满足容器的要求,iterator const_iterator必须存在这两种类型。许多算法和大量代码依赖于具有这两种类型的容器。但是,iterator类型没有理由必须是非const(可变(迭代器。在这种情况下,他们决定iteratorconst_iterator都是const(不可变(迭代器。

他们之所以const两个迭代器,是因为他们显然不希望您能够更改initializer_list中的值。

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

因为这些字段对于满足 Container 要求的任何类型都是必需的。 碰巧的是,在 std::initializer_listiteratorconst_iterator是一样的。

这可能是因为您不想更改存储在初始值设定项列表中的值。它们应该是要传递给构造函数的临时对象。

C++有一个(非正式的,目前(理想,称为适用于泛型类型的概念。容器概念要求某些类型定义可用于您的对象。由于 std::initializer_list 是一个容器,它需要 ::itrator 和 ::const_iterator typedefs。但是,与 std::set 一样,您不希望让用户修改initializer_list内的元素,因此 ::迭代器与 ::const_iterator: 相同,它们都是只读的。