Pomyśl o tym jak normalny wskaźnik:
int * const i;
jest const
wskaźnik do nieprzestrzegania const
int
. Możesz zmienić wartość int
, ale nie wskaźnik.
int const * i;
jest nie- const
wskaźnik do const
int
. Możesz zmienić wskaźnik, ale nie zmienić wartości int
.
Teraz, unique_ptr
, to kwestia, czy const
idzie wewnątrz lub na zewnątrz <>
. A więc:
std::unique_ptr<int> const u;
jest jak pierwszy. Możesz zmienić wartość int
, ale nie wskaźnik.
Co chcesz to:
std::unique_ptr<int const> u;
można zmienić wskaźnik, ale nie int
. Albo nawet:
std::unique_ptr<int const> const u;
Tutaj nie można zmienić wskaźnik lubint
.
Zauważ, jak zawsze umieszczam const
po prawej? Jest to trochę niecodzienne, ale jest konieczne, gdy mamy do czynienia ze wskaźnikami. const
zawsze odnosi się do rzeczy bezpośrednio po lewej stronie, czy to *
(wskaźnik to const
), czy int
. Zobacz http://kuhllib.com/2012/01/17/continental-const-placement/.
Pisanie const int
, może prowadzić do myślenia int const *
jest const
-pointer do niebędącego const
int
, co jest nie tak.
spodziewałem się, że to dlatego, że operator '.' nie może być przeciążony. – erip
W języku C++ 'const' jest płytkie. "Int * const" pozwala także modyfikować wskazany obiekt. –
Ten sam kod byłby dozwolony, gdyby wskaźnik nie był sprytny. Stała odnosi się do wskaźnika, a nie do wskażnika. – juanchopanza