2016-01-05 24 views
5

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?

+0

È 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

+2

'std :: vector :: operator []' restituisce un riferimento. 'std :: vector :: operator [] const' restituisce un riferimento const. –

+0

@Marshall Clow In qualche modo è caduto dalla mia versione originale. Lo aggiungerò di nuovo. Grazie. – pelletjl

risposta

0

Per chiarire, sembra che debba esistere un contenitore di tipo vettoriale dove const indica semplicemente che un utente non può modificare la dimensione del contenitore, ma gli elementi nel contenitore sono modificabili.

Questo è std::array. Si imposta la dimensione al momento della compilazione. Per l'impostazione della dimensione in fase di costruzione, viene proposta la dynarray.

+0

Sembra ragionevole per il vettore, ma per quanto riguarda gli altri contenitori STL? Sembra ragionevole avere qualcosa come std :: map in cui non è possibile aggiungere o rimuovere chiavi, ma i valori sono modificabili. – pelletjl

+0

Lo standard è la libreria non è una raccolta di tutte le cose possibili. –

+0

Poiché constness non implica valori noti in fase di compilazione, preferirei confrontare il nuovo array span/viste con contenitori non ridimensionabili di elementi mutabili. Ma per una ragione a mia insaputa, quelle viste hanno lo stesso comportamento di 'vector': Le loro operazioni si comportano come se la vista fosse i suoi elementi -' operator == 'confronta gli elementi e' const' è profondo rispetto al puntatore essi avvolgere. – dyp