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?
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
'std :: vector :: operator []' zwraca referencję. 'std :: vector :: operator [] const' zwraca odniesienie do stałej. –
@Marshall Clow Jakoś, co wypadło z mojego pierwotnego projektu. Dodam go z powrotem. Dzięki. – pelletjl