我認爲問題的一部分來自於一個假設,即分配器是有用的。 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