类别: 迭代器 | 组件类型: 概念 |
值类型 | 解引用平凡迭代器获得的值的类型 |
X | 平凡迭代器模型的类型 |
T | 的价值类型X |
x, y | 类型为X |
t | 类型为T |
平凡迭代器可以具有奇异值,这意味着大多数操作的结果(包括等值比较)都是未定义的。唯一保证支持的操作是将非奇异迭代器赋值给奇异迭代器。
平凡迭代器可以具有可解引用值,这意味着解引用它会产生一个定义明确的值。可解引用迭代器始终是非奇异的,但反过来不成立。例如,空指针是非奇异的(涉及空指针的操作是定义明确的),即使它不可解引用。
使可解引用迭代器失效意味着执行一个操作,在此操作之后,迭代器可能变为不可解引用或奇异。例如,如果p是指针,那么delete p会使p.
名称 | 表达式 | 类型要求 | 返回类型 |
---|---|---|---|
默认构造函数 | X x | ||
解引用 | *x | 可转换为T [1] | |
解引用赋值 | *x = t | X是可变的 | |
成员访问 | x->m [2] | T是类型,其中x.m已定义 |
名称 | 表达式 | 先决条件 | 语义 | 后置条件 |
---|---|---|---|---|
默认构造函数 | X x | x是奇异的 | ||
解引用 | *x | x是可解引用的 | ||
解引用赋值 | *x = t | x是可解引用的 | *x是 t 的副本 | |
成员访问 | x->m | x是可解引用的 | 等效于(*x).m |
标识 | x == y当且仅当&*x == &*y |
[1] 的返回类型的要求*x指定为“可转换为T”,而不是简单地T,因为迭代器有时会返回某种代理对象而不是迭代器概念上指向的对象。代理对象是实现细节,而不是接口的一部分(例如,它们的一种用途是允许迭代器根据其值是正在读取还是正在写入而表现出不同的行为),因此返回代理对象的迭代器的值类型仍然是T.
[2] 定义operator->对于迭代器依赖于 C++ 语言的一部分,但尚未由所有 C++ 编译器实现。如果您的编译器尚未支持此功能,则解决方法是使用(*it).m而不是it->m.