我认为问题的一部分来自于一个假设,即分配器是有用的。 Allocators(至少pre-C++ 11)were something of a late addition to the STL:
人们希望独立于内存模型的容器,因为语言不包含内存模型,所以容量过大。人们希望图书馆提供抽象记忆模型的一些机制。早期版本的STL假定容器的大小可以表示为size_t
类型的整数,并且两个迭代器之间的距离类型为ptrdiff_t
。现在我们被告知,你为什么不从中抽象出来?这是一项艰巨的任务,因为语言不是从中抽象出来的; C和C++数组没有被这些类型参数化。我们发明了一种叫做“分配器”的机制,它封装了关于内存模型的信息。这对图书馆中的每个组成部分造成了严重的后果。您可能想知道什么内存模型与算法或容器接口有关。如果您不能使用size_t
之类的东西,则由于指针类型不同(T*
,T huge *
等),您也不能使用T*
之类的东西。那么你不能使用引用,因为不同的内存模型你有不同的引用类型。图书馆有巨大的影响。
不幸的是,they turned out to be substandard:
我发明了分配器,以应对英特尔的内存架构。他们在理论上并不是一个坏主意 - 有一个封装所有内存的层:指针,引用,ptrdiff_t
,size_t
。不幸的是,他们不能在实践中工作。例如,
vector<int, alloc1> a(...);
vector<int, alloc2> b(...);
你现在不能说:
find(a.begin(), a.end(), b[1]);
b[1]
返回alloc2::reference
而不是int&
。它可能是一种类型不匹配。有必要改变核心语言处理引用的方式,以使分配器真正有用。
的reference
的typedef是为了返回任何的T&
相当于是有问题的分配。在现代架构上,这大概是T&
。然而,假定在某些体系结构上它可能是不同的(例如,针对具有“近”和“远”指针的体系结构的编译器可能需要对“近”和“远”引用的特殊语法)。可悲的是,这个出色的想法结果并不如人意。 C++ 11对分配器进行了重大更改 - 添加了作用域分配器 - 以及内存模型。我不得不承认我对C++ 11的变化w.r.t不够了解。分配者说如果事情变得更好或更糟。
望着在原来的问题的评论,因为该标准实际上并不说明容器必须如何实现(尽管标准没有把这么多的要求,对容器的行为,这可能也是如此。 ..),无论您键入的type为reference
必须具有T&
的行为,有人可能在实现容器时依赖这些行为:reference
类型的对象应该是原始对象的透明别名,分配给它应该改变没有切片的原始对象,没有必要支持“重置”reference
,取reference
的地址应该返回o的地址严格的对象等等。如果可能的话,它实际上应该是T&
;唯一的情况是我可以想象不可能的情况是,如果你分配的内存不能通过指针或引用进行操作(例如,如果“内存”实际上在磁盘上,或者内存是实际的分配在单独的计算机上,通过RPC调用通过网络访问等)。
我不认为有人会理解这个问题。他在问什么称为“参考”的类型需要表现得像。不是C++引用类型(如'int&')。 –
关于第二个想法,我现在不认为我理解Q.类型'reference'或'const_reference'的行为像一个正常的引用或const引用行为,为什么你认为它应该有任何不同? –
@Als:这个问题的字面意思是:“行为像一个正常的参考”是什么意思?这本身就是一个模糊的句子,所以我不知道在我的类型“行为像一个正常的参考”(如果我正在制作一个容器)之前我需要满足什么条件。 – Mehrdad