std::unique_ptr::operator->
有签名
pointer operator->() const noexcept;
所以operator->
是常量而是返回一个可变的指针.这允许代码如:
void myConstMemberFunction() const { myUniquePtrMember->nonConstFunction(); }
为什么标准允许这样做,以及防止使用的最佳方法是什么?
把它想象成一个普通的指针:
int * const i;
是const
指向非的指针const
int
.您可以更改int
,但不能更改指针.
int const * i;
是const
指向a的非指针const
int
.您可以更改指针但不能更改指针int
.
现在,因为unique_ptr
,这是一个问题,无论const
是内部还是外部<>
.所以:
std::unique_ptrconst u;
就像第一个.您可以更改int
,但不能更改指针.
你想要的是:
std::unique_ptru;
您可以更改指针,但不能更改int
.或者甚至是:
std::unique_ptrconst u;
在这里,你不能改变指针或的int
.
请注意我总是把它const
放在右边?这有点不常见,但在处理指针时是必要的.将const
始终适用于件事立即在其左边,是的*
(指针const
),或int
.见http://kuhllib.com/2012/01/17/continental-const-placement/.
写作const int
,可能会让你思考int const *
是const
一个非指针const
int
,这是错误的.
这复制了传统指针的语义.甲const
指针是一个不能被突变的指针.但是,它指向的对象可以.
struct bar { void do_bar() {} }; struct foo { void do_foo() const { b->do_bar(); } // OK bar* const b; };
为了避免改变指针,你需要unique_ptr
等效的const指向const,或者
const std::unique_ptrb;