Pensateci come un normale puntatore:
int * const i;
è un puntatore ad un const
non const
int
. È possibile modificare int
, ma non il puntatore.
int const * i;
è un const
puntatore non ad un const
int
. È possibile modificare il puntatore ma non lo int
.
Ora, per unique_ptr
, è una questione di se l'const
va all'interno o all'esterno della <>
. Quindi:
std::unique_ptr<int> const u;
è come il primo. È possibile modificare int
, ma non il puntatore.
Quello che vuoi è:
std::unique_ptr<int const> u;
È possibile modificare il puntatore, ma non il int
. O forse anche:
std::unique_ptr<int const> const u;
Qui non si può cambiare il puntatore o il int
.
Notate come ho sempre posto il const
a destra? Questo è un po 'raro, ma è necessario quando si tratta di puntatori. Lo const
si applica sempre alla cosa immediatamente alla sua sinistra, ovvero *
(il puntatore è const
) o int
. Vedi http://kuhllib.com/2012/01/17/continental-const-placement/.
scrittura const int
, potrebbe condurvi a pensare int const *
è un const
-pointer ad un non const
int
, che è sbagliato.
mi aspettavo che sia perché l'operatore '.' non può essere sovraccaricato. – erip
In C++ 'const' è superficiale. Un 'int * const' consente anche di modificare l'oggetto puntato. –
Lo stesso codice sarebbe consentito se il puntatore non fosse intelligente. La costanza si applica al puntatore, non al puntale. – juanchopanza