c++ - 为什么复制 const shared_ptr& 不会违反 const-ness?

标签 c++ constants shared-ptr

尽管我的代码编译得很好,但这一直困扰着我,我无法在 stackoverflow 上找到答案。以下通用构造函数是将 shared_ptr 传递给构造函数中的类实例的一种方法。

MyClass {
  MyClass(const std::shared_ptr<const T>& pt);
  std::shared_ptr<const T> pt_;  //EDITED: Removed & typo
};

MyClass::MyClass(const std::shared_ptr<const T>& pt)
  : pt_(pt)
{ }

这编译得很好。我的问题如下:在我的理解中,像这样声明一个参数 const:

void myfunc(const T& t)

promise 不改变t。 但是,通过将 shared_ptr pt 复制到 pt_,我是否没有有效地增加 shared_ptr pt 的使用次数,从而违反了假定的常量性?

这可能是我对 shared_ptr 的根本误解?

(对于任何阅读本文并希望实现它的人,请注意 this 可能是更好的实现方式)

最佳答案

std::shared_prt<>的成员之一必须有老式的复制构造函数:

shared_ptr(const shared_ptr& r) noexcept;

标准说(C++11 20.7.2.2.1/18 “shared_ptr 构造函数”)“如果 r 为空,则构造一个空的 shared_ptr 对象;否则,构造一个与 r 共享所有权的 shared_ptr 对象”。

该标准没有提及如何通过 const 实现“与 r 共享所有权”。引用。一些选项可能是:

  • 实现共享所有权语义的私有(private)成员可能被标记为mutable
  • 实现共享所有权的数据结构可能实际上并不存在于 shared_ptr 中对象 - 它们可能是一组单独的对象,例如可以通过指针获得。

关于c++ - 为什么复制 const shared_ptr& 不会违反 const-ness?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36271663/

相关文章:

c++ - 运算符 = 重载

c++ - C++ 中的共享、弱指针和惰性指针

c++ - 对指针 vector 进行排序会更改 vector 拷贝中的数据?

c++ - Qt Q_OBJECT 宏导致样式表出现意外行为

c++ - 如何访问子类中的小部件?

Ruby:常量查找在 instance_eval/class_eval 中如何工作?

c - 在 C 中定义全局常量

c - 为什么我不能分配一个 const 值,我应该怎么做?

c++ - boost 侵入式指针

c++ - 哪种转换技术更适合在 C++ 中从上层到下层进行转换