尽管我的代码编译得很好,但这一直困扰着我,我无法在 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/