我正在阅读shared_ptr的工具。代码是:
template<typename _Tp, _Lock_policy _Lp>
class __shared_ptr
{
public:
template<typename _Tp1, typename = _Convertible<_Tp1*>>
__shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r) noexcept
: _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount)
{ }
...
private:
...
__shared_count<_Lp> _M_refcount;
};
问题:
_M_refcount
是私有数据,为什么可以在_M_refcount(__r._M_refcount)
中使用它
并且没有错误?
答案 0 :(得分:2)
这是因为所有__shared_ptr
模板化的类之间都是made friends:
template<typename _Tp1, _Lock_policy _Lp1> friend class __shared_ptr;
如果以上是不够的,这里有一些介绍访问修饰符:)
private
成员只能通过同一类中的名称访问。
E.g。这没关系:
class X
{
private:
int a;
public:
auto foo(X other)
{
return other.a; // OK
}
};
在处理类模板时,您必须意识到从模板生成的每个类都是不同的类:
template <class T> class X
{
private:
int a;
public:
template <class U>
auto foo(X<U> other)
{
return other.a; // OK iff U == T
}
};
X<int> xi;
X<bool> xb;
xi.foo(xb); // not OK
xi.foo(xi); // OK
为了让上述代码适用于任何foo
,所有X<T>
类都必须是朋友:
template <class U>
friend class X;
这是__shared_ptr
类模板中发生的事情。