2016-01-05 14 views
5

Po latach ślepego zaakceptowania faktu, że std::vector<T>::operator[] const zwraca const_reference, ale w świetle tego, jak działa const dla inteligentnych wskaźników, zaczynam się zastanawiać, dlaczego to i pozostałe pojemniki STL zostały zaprojektowane, droga. Wydaje się, że "constness" z const std::vector jest stosowany zarówno do wektora i jego elementów, podczas gdy dla inteligentnych wskaźników "constness" odnosi się tylko do wskaźnika, a nie do elementu, do którego wskazuje.stała poprawność dla kontenerów

Aby wyjaśnić, wygląda na to, że powinien istnieć wektoropodobny pojemnik, w którym const oznacza po prostu, że użytkownik nie może zmienić rozmiaru pojemnika, ale elementy w kontenerze są zmienne. Moje główne pytanie brzmi: czy istnieje coś, co uniemożliwiłoby, aby ten typ pojemnika był "poprawny"?

Wygląda na to, że istnieje kilka hackowskich obejść poprzez dodanie dodatkowej warstwy pośredniej (na przykład std::vector<std::unique_ptr<T>> const), aby to osiągnąć, ale szukam czegoś trochę mniej niezręcznego pod względem konserwacji.

Odkładając na bok, jeśli inteligentne wskaźniki zostały włączone do języka przed kontenerami STL, czy stałe akcesory byłyby zdefiniowane tak, jak są dzisiaj?

+0

Można zdefiniować własną klasę, która używa kompozycji, aby działać w sposób niezależny na "zmiennym std :: vector" i zapewnia stałą poprawność (w twoim rozumieniu) poprzez publiczne funkcje członkowskie. – oLen

+2

'std :: vector :: operator []' zwraca referencję. 'std :: vector :: operator [] const' zwraca odniesienie do stałej. –

+0

@Marshall Clow Jakoś, co wypadło z mojego pierwotnego projektu. Dodam go z powrotem. Dzięki. – pelletjl

Odpowiedz

0

celu wyjaśnienia, wydaje się, że powinien być podobny pojemnik wektor gdzie const po prostu oznacza, że ​​użytkownik nie może zmienić wielkość pojemnika, ale elementy w pojemniku są zmienne.

To jest std::array. Ustawiasz rozmiar podczas kompilacji. Aby ustawić rozmiar w czasie konstruktora, zaproponowano dynarray.

+0

Wydaje się to uzasadnione dla wektora, ale co z innymi kontenerami STL? Wydaje się rozsądne mieć coś takiego jak std :: map, gdzie nie można dodawać ani usuwać kluczy, ale wartości są zmienne. – pelletjl

+0

Standardem jest biblioteka nie jest zbiorem wszystkich możliwych rzeczy. –

+0

Ponieważ constness nie implikuje wartości znanych w czasie kompilacji, wolałbym porównać nowe zasięgi/widoki tablic z nierozmiennymi kontenerami z zmiennymi elementami. Ale z niezrozumienia dla mnie, te poglądy mają takie samo zachowanie jak "wektor": ich operacje zachowują się tak, jakby widok był jego elementami - 'operator ==' porównuje elementy, a 'const' jest głęboki w przeciwieństwie do wskaźnika, owinąć. – dyp

Powiązane problemy