Hãy suy nghĩ về nó như một con trỏ bình thường:
int * const i;
là một con trỏ const
đến một phi const
int
. Bạn có thể thay đổi int
, nhưng không thay đổi con trỏ.
int const * i;
là một phi const
con trỏ đến một const
int
. Bạn có thể thay đổi con trỏ chứ không phải là số int
.
Bây giờ, cho unique_ptr
, đó là một câu hỏi liệu các const
đi bên trong hoặc bên ngoài <>
. Vì vậy:
std::unique_ptr<int> const u;
giống như hình đầu tiên. Bạn có thể thay đổi int
, nhưng không thay đổi con trỏ.
gì bạn muốn là:
std::unique_ptr<int const> u;
Bạn có thể thay đổi con trỏ, nhưng không phải là int
. Hoặc thậm chí:
std::unique_ptr<int const> const u;
Ở đây bạn không thể thay đổi con trỏ hoặc các int
.
Lưu ý cách tôi luôn đặt const
ở bên phải? Đây là một ít phổ biến, nhưng là cần thiết khi giao dịch với con trỏ. Các const
luôn luôn áp dụng cho điều ngay lập tức bên trái của nó, là *
(con trỏ là const
), hoặc int
. Xem http://kuhllib.com/2012/01/17/continental-const-placement/.
Viết const int
, có thể dẫn bạn đến suy nghĩ int const *
là một số const
-con trỏ đến số không const
int
, điều đó là sai.
tôi mong đợi đó là bởi vì các nhà điều hành '.' không thể bị quá tải. – erip
Trong C++ 'const' là cạn. Một 'int * const' cũng cho phép bạn sửa đổi đối tượng được trỏ tới. –
Mã tương tự sẽ được cho phép nếu con trỏ không thông minh. Độ chói áp dụng cho con trỏ, không áp dụng cho con trỏ. – juanchopanza