【发布时间】:2013-11-13 03:20:00
【问题描述】:
在阅读 C++11 中的 SCARY 迭代器时,I see:
从编译器的角度来看,这里没有错。然而,从实际的角度来看,列表迭代器和列表分配器之间没有任何语义依赖性。而且,一般而言,对于所有 STL 容器,迭代器仅取决于(语义上)容器元素类型。
不过有一点我不明白:
当operator * 或operator-> 应用于迭代器时,迭代器返回reference 和pointer 类型。
reference、pointer、difference_type等都是从allocator中的typedefs派生而来的。
但分配器不一定必须将pointer定义为value_type *(或者甚至将difference_type定义为ptrdiff_t),例如。
迭代器(一个 SCARY 迭代器)如何在不知道分配器的情况下知道要返回的数据类型?
迭代器是否天生就依赖于它们的这些类型定义的分配器?
【问题讨论】:
-
为什么
pointer和value_type是从分配器而不是模板参数本身派生的?你没有向后依赖吗? -
@MarkRansom:你指的是哪个模板参数本身?数据类型
T? -
是的,抱歉我的评论含糊不清。
-
@MarkRansom:
vector::pointer派生自allocator::pointer,这意味着VectorIterator::pointer必须派生自vector::pointer,或者换句话说,间接派生自allocator::pointer。我不认为所有分配器都需要pointer为value_type *。否则 typedef 将完全没有意义(没有双关语)。 -
@Mehrdad:目前大多数分配器对于这些类型都有相同的 typedef(分配器甚至不需要提供类型,因为
allocator_traits中有一个默认值)。在这种情况下,迭代器类型可以相同。