繁体   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