Dopo anni di accettare ciecamente il fatto che std::vector<T>::operator[] const
restituisce const_reference
, ma, alla luce di come funziona const per i puntatori intelligenti, sto iniziando ora a chiedermi perché e il resto dei contenitori STL sono stati progettati modo. Sembra che la "costanza" di un const std::vector
sia applicata sia al vettore sia ai suoi elementi, mentre per i puntatori intelligenti la "costanza" si applica solo al puntatore e non all'elemento a cui punta.correttezza const per container
Per chiarire, sembra che debba esistere un contenitore di tipo vettoriale in cui const
significa semplicemente che un utente non può modificare la dimensione del contenitore, ma gli elementi nel contenitore sono modificabili. La mia domanda principale è: c'è qualcosa che impedisce a questo tipo di contenitore di essere "corretto"?
Sembra che ci siano un paio di soluzioni alternative con l'aggiunta di un ulteriore livello di riferimento indiretto (ad esempio std::vector<std::unique_ptr<T>> const
) per ottenere ciò, ma sto cercando qualcosa di un po 'meno imbarazzante in termini di manutenzione.
Per inciso, se i puntatori intelligenti sono stati incorporati nella lingua prima dei contenitori STL, i metodi di accesso const sono stati definiti nel modo in cui sono oggi?
È possibile definire la propria classe che utilizza la composizione per agire indirettamente su un 'std :: vector' mutevole e garantisce la correttezza di const (nel senso vostro) attraverso le funzioni dei membri pubblici. – oLen
'std :: vector :: operator []' restituisce un riferimento. 'std :: vector :: operator [] const' restituisce un riferimento const. –
@Marshall Clow In qualche modo è caduto dalla mia versione originale. Lo aggiungerò di nuovo. Grazie. – pelletjl