c++ - 在 shared_ptr 的复制构造函数中

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

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

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

  2. 复制构造函数还应该增加一个成员数据——“引用计数器”——它也在所有 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.pf 中有 int * const 类型,但它不是 int const * const!换句话说,您不能更改 x.p,但您可以更改 *x.p

这本质上就是共享指针复制构造函数中发生的事情(其中 *p 充当引用计数器的角色)。

关于c++ - 在 shared_ptr 的复制构造函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12342292/

相关文章:

c++ - 使用 SDL2 从 C++11 线程可移植地退出 readline

c++ - shared_ptr<void> 如何知道使用哪个析构函数?

c++ - vector<A> vs vector<A*> vs vector<shared_ptr<A>> 在 C++ 中

c++ - 我在哪里可以找到涵盖 K&R1/2、C89-C1X 及其来源的 C(和/或 C++)关键字列表?

c++ - 右值引用绑定(bind)到 std::function 类型的左值

c++ - 为什么逻辑和顺序改变会给出不同的输出?

c++ - 为什么 C++0x 中的 Lambda 函数返回类型必须是自动的?

c++ - shared_array 的元素作为 shared_ptr?

c++ - 套接字编程。 connect(...) api 问题

c++ - 取消绑定(bind) lambda 事件处理程序