const std::shared_ptr<int> x (new int (2));
const std::shared_ptr<int> y (x);
复制共享指针会对控制块进行更改,其中&#39; const&#39;共享指针指向,这与constness部分不矛盾吗?
答案 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
修改使用次数。