我对shared_ptr复制构造函数有些困惑。请考虑以下两行:
它是对shared_ptr对象的“常量”引用,它被传递给复制构造函数,以便初始化另一个shared_ptr对象。
复制构造函数也应该增加一个成员数据 - “引用计数器” - 它也在所有shared_ptr对象之间共享,因为它是一个引用每个shared_ptr对象的某个整数的引用/指针有多少人还活着。
但是,如果复制构造函数试图增加引用计数成员数据,它是否“命中”了引用传递的shared_ptr的常量?或者,复制构造函数是否在内部使用const_cast运算符来临时删除参数的常量?
答案 0 :(得分:5)
您遇到的现象对共享指针并不特殊。这是典型的原始示例:
struct Foo
{
int * p;
Foo() : p(new int(1)) { }
};
void f(Foo const & x) // <-- const...?!?
{
*x.p = 12; // ...but this is fine!
}
x.p
int * const
内的f
类型确实存在,但不 int const * const
!换句话说,您无法更改x.p
,但可以更改*x.p
。
这基本上是共享指针复制构造函数中发生的事情(其中*p
扮演引用计数器的角色)。
答案 1 :(得分:2)
它使用内部指针,不会继承参数的竞争,例如:
(*const_ref.member)++;
有效。
答案 2 :(得分:0)
指针是常量,但不是指向的值。
答案 3 :(得分:0)
int const *a = &b; // option1
const int *a = &b; // option2
int * const a = &b; // option3
但我错了!只有前两个选项是等效的。第三个是完全不同的。
使用option1或option2,“a”可以指向它想要的任何内容,但不能更改它指向的内容。
使用option3,一旦确定了“a”指向的内容,它就无法指向其他任何内容。但是可以自由地改变它指向的内容。因此,shared_ptr使用option3是有道理的。