在shared_ptr的复制构造函数内

sof*_*ver 2 c++ copy-constructor shared-ptr c++11

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

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

  2. 复制构造函数也应该增加一个成员数据 - "引用计数器" - 它也在所有shared_ptr对象之间共享,因为它是一个引用某个整数的引用/指针,告诉每个shared_ptr对象它们中有多少仍然存在活.

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

Ker*_* SB 5

您遇到的现象对共享指针并不特殊.这是典型的原始示例:

struct Foo
{
    int * p;
    Foo() : p(new int(1)) { }
};

void f(Foo const & x)  // <-- const...?!?
{
    *x.p = 12;         // ...but this is fine!
}
Run Code Online (Sandbox Code Playgroud)

这是事实,x.p具有类型int * const里面f,但它不是一个int const * const!换句话说,你不能改变x.p,但你可以改变*x.p.

这基本上是在共享指针复制构造函数中*p发生的事情(其中扮演引用计数器的角色).