当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么unique_ptroperator->notconst-overloaded?》经验,为你挑选了2个好方法。

std::unique_ptr::operator-> 有签名

pointer operator->() const noexcept;

所以operator->是常量而是返回一个可变的指针.这允许代码如:

void myConstMemberFunction() const
{
    myUniquePtrMember->nonConstFunction();
}

为什么标准允许这样做,以及防止使用的最佳方法是什么?



1> BoBTFish..:

把它想象成一个普通的指针:

int * const i;

const指向非的指针const int.您可以更改int,但不能更改指针.

int const * i;

const指向a的非指针const int.您可以更改指针但不能更改指针int.


现在,因为unique_ptr,这是一个问题,无论const是内部还是外部<>.所以:

std::unique_ptr const u;

就像第一个.您可以更改int,但不能更改指针.

你想要的是:

std::unique_ptr u;

您可以更改指针,但不能更改int.或者甚至是:

std::unique_ptr const u;

在这里,你不能改变指针int.


请注意我总是把它const放在右边?这有点不常见,但在处理指针时是必要的.将const始终适用于件事立即在其左边,是的*(指针const),或int.见http://kuhllib.com/2012/01/17/continental-const-placement/.

写作const int,可能会让你思考int const *const一个非指针const int,这是错误的.



2> juanchopanza..:

这复制了传统指针的语义.甲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_ptr b;

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有