同一类型的多个类型定义
multiple typedef for same type
下面的代码是 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
(可变(迭代器。在这种情况下,他们决定iterator
和const_iterator
都是const
(不可变(迭代器。
他们之所以const
两个迭代器,是因为他们显然不希望您能够更改initializer_list
中的值。
作为另一个示例,请查看std::set
其iterator
和const_iterator
类型也是常量迭代器。由于std::set
包含有序元素,如果您能够更改std::set
的内容,则该排序将失效。为了防止这种情况,这两种迭代器类型都是不可变的。
因为这些字段对于满足 Container
要求的任何类型都是必需的。 碰巧的是,在 std::initializer_list
,iterator
和const_iterator
是一样的。
这可能是因为您不想更改存储在初始值设定项列表中的值。它们应该是要传递给构造函数的临时对象。
C++有一个(非正式的,目前(理想,称为适用于泛型类型的概念。容器概念要求某些类型定义可用于您的对象。由于 std::initializer_list 是一个容器,它需要 ::itrator 和 ::const_iterator typedefs。但是,与 std::set 一样,您不希望让用户修改initializer_list内的元素,因此 ::迭代器与 ::const_iterator: 相同,它们都是只读的。
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 列表参数的类型定义
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 关于 C++ 中的函数类型定义
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 将使用/类型定义限制为类范围
- 模板类型定义?
- C++:模板类的类型定义
- 如何对命名空间限定类型进行类型定义?
- 此递归模板类型定义是否有效C++?
- 具有调整对齐方式的类型定义
- C++从抽象类型定义类成员
- 用于C++代码的 API 监视器类型定义 (XML)
- 如何将result_of与函数类型定义一起使用
- 在C++的适当类型定义位置
- 如何根据模板类型定义浮点常量?
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 参数化类的别名(或类型定义)内部类
- 如果我想从类型"T"定义元素的容器(来自 STL),那么"T"必须使用默认构造函数?