共享指针的控制块如何与const共享指针一起运行

时间:2016-12-30 12:03:52

标签: c++11 smart-pointers

const std::shared_ptr<int> x (new int (2));
const std::shared_ptr<int> y (x);

复制共享指针会对控制块进行更改,其中&#39; const&#39;共享指针指向,这与constness部分不矛盾吗?

3 个答案:

答案 0 :(得分:0)

shared_ptr包含(一般来说)两个指针。一个用于容纳一个对象,另一个用于内部&#39;具有引用等的数据。如果使shared_ptr保持不变,则意味着您无法修改这些指针,但可以毫无问题地修改它们指向的对象。

如果这是一个矛盾?对我来说不是,但肯定有人会说它是。一种哲学问题。 :)

答案 1 :(得分:-1)

控制块是用户无权访问且不应关注的实现细节。它不是shared_ptr接口的一部分,无法被观察到。

shared_ptr指针是const。这意味着你无法重新分配它。

在这方面它的行为类似于普通const指针:它可以复制,但不能重新分配。

答案 2 :(得分:-1)

它可以将控制块成员声明为mutable(不太可能,请参阅Maxim的注释),或者(更有可能)它可以将非const指针指向控制块作为会员。在const shared_ptr is allowed中更改指向控制块的值,只需重新指定该指针,而不是const

要从MSVC2015中获取一个真实世界的示例(我知道我知道),shared_ptr有一个成员_Rep

private:
    _Ty *_Ptr;
    _Ref_count_base *_Rep;

shared_ptr可以通过_Rep修改使用次数。