我对 shared_ptr 复制构造函数有些困惑。请考虑以下两行:
它是对 shared_ptr 对象的“常量”引用,它被传递给复制构造函数,以便初始化另一个 shared_ptr 对象。
复制构造函数还应该增加一个成员数据——“引用计数器”——它也在所有 shared_ptr 对象之间共享,因为它是一个指向某个整数的引用/指针,告诉每个 shared_ptr 对象他们中有多少人还活着。
但是,如果复制构造函数试图增加引用计数成员数据,它不会“命中”通过引用传递的 shared_ptr 的常量性吗?或者,复制构造函数是否在内部使用 const_cast 运算符来临时删除参数的常量性?
最佳答案
您遇到的现象并不是共享指针特有的。这是一个典型的原始示例:
struct Foo
{
int * p;
Foo() : p(new int(1)) { }
};
void f(Foo const & x) // <-- const...?!?
{
*x.p = 12; // ...but this is fine!
}
确实 x.p
在 f
中有 int * const
类型,但它不是 int const * const
!换句话说,您不能更改 x.p
,但您可以更改 *x.p
。
这本质上就是共享指针复制构造函数中发生的事情(其中 *p
充当引用计数器的角色)。
关于c++ - 在 shared_ptr 的复制构造函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12342292/