Подумайте об этом, как обычный указатель:
int * const i;
является const
указатель на не- const
int
. Вы можете изменить int
, но не указатель.
int const * i;
является не- const
указатель на const
int
. Вы можете изменить указатель, но не int
.
Теперь для unique_ptr
, это вопрос о том, const
идет внутри или снаружи <>
. Таким образом:
std::unique_ptr<int> const u;
как первый. Вы можете изменить int
, но не указатель.
Что вы хотите:
std::unique_ptr<int const> u;
Вы можете изменить указатель, но не int
. Или, возможно, даже:
std::unique_ptr<int const> const u;
Здесь вы не можете изменить указатель илиint
.
Обратите внимание, что я всегда размещаю const
справа? Это немного необычно, но необходимо иметь дело с указателями. const
всегда относится к предмету сразу слева от него, будь то *
(указатель const
) или int
. См. http://kuhllib.com/2012/01/17/continental-const-placement/.
Дать const int
, может привести вас к мысли int const *
является const
-указатель к не- const
int
, что неправильно.
Я ожидал, что это потому, что оператор '.' не может быть перегружен. – erip
В C++ 'const' неглубоко. «Int * const» также позволяет вам изменять направленный объект. –
Тот же код будет разрешен, если указатель не был умным. Устойчивость применяется к указателю, а не к указателю. – juanchopanza