簡體   English   中英

為什么unique_ptr operator-> not const-overloaded?

[英]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 intconst指針。 您可以更改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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM