myślę część pytania pochodzi z założenia, że podzielniki są użyteczne. Przydzielacze (przynajmniej pre-C++ 11) were something of a late addition to the STL:
Ludzie chcieli kontenerów niezależnych od modelu pamięci, co było nieco przesadzone, ponieważ język nie zawiera modeli pamięci. Ludzie chcieli, aby biblioteka zapewniała pewien mechanizm abstrakcji modeli pamięci. Wcześniejsze wersje STL zakładały, że rozmiar kontenera można wyrazić jako liczbę całkowitą typu size_t
, a odległość między dwoma iteratorami jest typu ptrdiff_t
. A teraz powiedziano nam, dlaczego nie można tego streścić? Jest to wysokie zamówienie, ponieważ język nie jest abstrakcyjny; Macierze C i C++ nie są sparametryzowane przez te typy. Wynaleźliśmy mechanizm o nazwie "alokator", który zawiera informację o modelu pamięci. To spowodowało poważne konsekwencje dla każdego komponentu w bibliotece. Można się zastanawiać, jakie modele pamięci mają do czynienia z algorytmami lub interfejsami kontenera. Jeśli nie możesz używać rzeczy takich jak size_t
, nie możesz również używać rzeczy takich jak T*
z powodu różnych typów wskaźników (T*
, T huge *
itd.). Wtedy nie możesz używać referencji, ponieważ w różnych modelach pamięci masz różne typy odniesienia. Istniały ogromne konsekwencje w bibliotece.
Niestety they turned out to be substandard:
wymyśliłem podzielników do czynienia z architekturą pamięci Intela. Nie są to takie złe idee w teorii - posiadające warstwę, która obejmuje całą pamięć: wskaźniki, odnośniki, ptrdiff_t
, size_t
. Niestety nie mogą one działać w praktyce. Na przykład,
vector<int, alloc1> a(...);
vector<int, alloc2> b(...);
nie można teraz powiedzieć:
find(a.begin(), a.end(), b[1]);
b[1]
zwraca alloc2::reference
i nie int&
. Może to być niedopasowanie typu. Konieczna jest zmiana sposobu, w jaki język podstawowy zajmuje się odwołaniami, aby alokatory naprawdę się przydały.
reference
typedef ma powrócić cokolwiek odpowiednik T&
jest dla podzielnika w pytaniu. Na nowoczesnych architekturach jest to prawdopodobnie T&
. Założono jednak, że w niektórych architekturach może to być coś innego (np. Kompilator kierujący się architekturą z "bliskimi" i "daleko" wskaźnikami może potrzebować specjalnej składni dla odniesień "blisko" i "daleko"). Niestety, ten genialny pomysł okazał się mniej błyskotliwy. C++ 11 wprowadza istotne zmiany w alokatorach - dodając podzielniki podzielone na punkty - i model pamięci. Muszę przyznać, że nie wiem wystarczająco dużo o zmianach C++ 11 w.r.t. podzielników, aby powiedzieć, czy sytuacja się poprawi, czy pogorszy.
Patrząc na komentarze na oryginalne pytanie, ponieważ standard nie faktycznie stwierdzić, jak pojemniki muszą być realizowane (chociaż standard nie wkładać tak wiele wymagań na zachowanie pojemnikach, że równie dobrze. ..), niezależnie od typu, który wpisałeś jako reference
, musisz mieć zachowanie T&
, na którym ktoś mógłby potencjalnie polegać podczas implementacji kontenera: obiekt typu reference
powinien być przezroczystym aliasem do oryginalnego obiektu, przypisanie do niego powinno zmienić wartość oryginalny obiekt bez przecinania, nie ma potrzeby obsługi "ponownego instalowania" reference
, przyjmując adres reference
powinien zwracać adres o obiekt sztywny itp. Jeśli to w ogóle możliwe, powinien być w rzeczywistości T&
; i jedyny przypadek, w którym mogę sobie wyobrazić, gdzie nie byłoby to możliwe, byłby, gdybyś przydzielał pamięć, której nie mógłbyś manipulować przez wskaźniki lub referencje (np. gdyby "pamięć" była rzeczywiście na dysku, lub gdyby pamięć była rzeczywiście przydzielone na oddzielnym komputerze i dostępne przez sieć za pośrednictwem wywołań RPC itp.).
Wyrwane z normą
Nie sądzę, aby ktokolwiek rozumiał to pytanie. Pyta, jaki typ, który nazywa się "referencją", musi zachowywać się jak. Nie jest to typ referencyjny C++ (np. 'Int &'). –
W drugiej chwili myślę, że w ogóle nie rozumiem Q. Typ "referencja" lub "const_reference" zachowuje się jak normalna referencja lub zachowuje się odwołanie do const, dlaczego uważasz, że powinno zachowywać się inaczej? –
@Als: Pytanie dosłownie brzmi: co oznacza "zachowanie jak normalne odniesienie"? To osobliwe zdanie samo w sobie, więc nie wiem, jakie warunki musiałbym spełnić, zanim mój typ "zachowa się jak normalne odniesienie" (na przykład gdy robiłem pojemnik). – Mehrdad