[英]Why does std::unique_ptr operator* throw and operator-> does not throw?
[英]Why is unique_ptr operator-> not const-overloaded?
std::unique_ptr::operator->
具有签名
pointer operator->() const noexcept;
所以operator->
是const但返回一个可变指针。 这允许代码如:
void myConstMemberFunction() const
{
myUniquePtrMember->nonConstFunction();
}
为什么标准允许这样做,以及防止使用的最佳方法是什么?
把它想象成一个普通的指针:
int * const i;
是一个指向非const
int
的const
指针。 您可以更改int
,但不能更改指针。
int const * i;
是一个指向const
int
的非const
指针。 您可以更改指针但不能更改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
-pointer到非const
int
,这是错误的。
这复制了传统指针的语义。 const
指针是一个无法变异的指针。 但是,它指向的对象可以。
struct bar {
void do_bar() {}
};
struct foo {
void do_foo() const { b->do_bar(); } // OK
bar* const b;
};
为了避免改变指针对象,你需要与const指向const的指针的unique_ptr
等价物,或者
const std::unique_ptr<const bar> b;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.