在shared_ptr的复制构造函数内

时间:2012-09-09 19:37:22

标签: c++ c++11 shared-ptr copy-constructor

我对shared_ptr复制构造函数有些困惑。请考虑以下两行:

  1. 它是对shared_ptr对象的“常量”引用,它被传递给复制构造函数,以便初始化另一个shared_ptr对象。

  2. 复制构造函数也应该增加一个成员数据 - “引用计数器” - 它也在所有shared_ptr对象之间共享,因为它是一个引用每个shared_ptr对象的某个整数的引用/指针有多少人还活着。

  3. 但是,如果复制构造函数试图增加引用计数成员数据,它是否“命中”了引用传递的shared_ptr的常量?或者,复制构造函数是否在内部使用const_cast运算符来临时删除参数的常量?

4 个答案:

答案 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)

哇,这真是令人大开眼界!感谢大家,我已经能够将混淆的根源归结为我总是假设以下(“a”包含“b”的地址)都是等价的。

int const  *a = &b;    // option1
const int  *a = &b;    // option2
int * const a = &b;    // option3

但我错了!只有前两个选项是等效的。第三个是完全不同的。

使用option1或option2,“a”可以指向它想要的任何内容,但不能更改它指向的内容。

使用option3,一旦确定了“a”指向的内容,它就无法指向其他任何内容。但是可以自由地改变它指向的内容。因此,shared_ptr使用option3是有道理的。