6

我不确定我是否因文档错误或头痛而遭受更多痛苦,所以...

我想要做的是创建一个 shared_ptr 与另一个共享所有权,但它引用对象的成员而不是整个对象。简单的例子,起点...

struct s
{
  int a, b;
};

shared_ptr<s> s1 (new s);  //  pointing to whole object

en.cppreference.com, shared_ptr 的构造函数(8)是......

template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );

描述中提到“构造一个与 r 共享所有权信息的 shared_ptr,但拥有一个不相关且非托管的指针 ptr ...例如在 ptr 是 r 管理的对象的成员的典型用例中”。

所以...T只是不小心从该构造函数中的模板中遗漏了,还是我遗漏了什么?事实上,Y 对我来说似乎也是错误的,所以一般来说,构造函数的描述是否正确?

我希望我能做的是这样的事情......

shared_ptr<int> s2 (s1, &(s1.get ()->a));

s2指向成员a(an int),但与 共享整个对象的所有权s1

那是理智的吗?

4

3 回答 3

9

T参数是其shared_ptr自身的模板参数,而该Y参数是该特定shared_ptr构造函数的模板参数。像这样的东西:

template< class T >
class shared_ptr
{
     template< class Y >
     shared_ptr( const shared_ptr<Y>& r, T *ptr );
}

至于您发布的示例代码,我觉得这很好。

于 2012-11-13T12:10:53.600 回答
4

文档是正确的。您忘记了这是类模板上构造函数的文档,即构造函数的shared_ptr<T>类限定声明是:

template<typename T>
template<typename Y>
shared_ptr<T>::shared_ptr(const shared_ptr<Y>& r, T *ptr);

所以在你的例子T中 isintYis s

于 2012-11-13T12:13:14.387 回答
2

T是类的模板参数,而不是构造函数的模板参数。这正是它所需要的:指向成员的指针必须具有成员的类型并忘记/擦除(参见类型擦除)包含对象的类型(Y在这种情况下)。

您发布的代码应该可以工作,您甚至可以将其编写得更简单一些:

shared_ptr<int> s2 (s1, &s1->a);
于 2012-11-13T12:13:16.880 回答