[英]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.