什么是shared_ptr的别名构造函数?

lqr*_*lqr 40 c++ c++11

在此页面(http://www.cplusplus.com/reference/memory/shared_ptr/)第5段中,它说:

此外,shared_ptr对象可以在指向另一个对象的同时共享指针的所有权.此功能称为别名(请参阅构造函数),通常用于指向成员对象,同时拥有它们所属的对象.因此,shared_ptr可能与两个指针有关:

  • 存储指针,它是指向它的指针,以及它与运算符*取消引用的指针.

  • 一个拥有的指针(可能是共享的),它是所有权组在某个时刻负责删除的指针,并且它被视为一个用途.

通常,存储的指针和拥有的指针引用相同的对象,但是别名shared_ptr对象(使用别名构造函数及其副本构造的对象)可以引用不同的对象.

然后我读了这页(http://www.cplusplus.com/reference/memory/shared_ptr/shared_ptr/)关于shared_ptr的别名构造函数.但我仍然认为这种"走样"行为令人困惑.为什么在这里?它是为了什么?在什么情况下我想要这个功能?

Bar*_*rry 47

简单的例子:

struct Bar { 
    // some data that we want to point to
};

struct Foo {
    Bar bar;
};

shared_ptr<Foo> f = make_shared<Foo>(some, args, here);
shared_ptr<Bar> specific_data(f, &f->bar);

// ref count of the object pointed to by f is 2
f.reset();

// the Foo still exists (ref cnt == 1)
// so our Bar pointer is still valid, and we can use it for stuff
some_func_that_takes_bar(specific_data);
Run Code Online (Sandbox Code Playgroud)

别名是我们真正想要指出的时候Bar,但我们也不希望Foo从我们这里删除.


正如约翰内斯在评论中指出的那样,有一个相当的语言特征:

Bar const& specific_data = Foo(...).bar;
Bar&& also_specific_data = Foo(...).bar;
Run Code Online (Sandbox Code Playgroud)

我们正在引用一个临时成员,但暂时Foo仍然保持活着specific_data.如同shared_ptr例子,我们有什么是Bar它的生命周期被绑定到一个Foo-一个Foo我们无法访问.

  • 也许你可以将它与`struct A {int x; }; const int&x = A().x;`.在这种情况下,只要引用"x"存在,"A"对象就会保持活动状态. (3认同)
  • @user2485710我认为你误解了这个问题?我创建的“shared_ptr&lt;Bar&gt;”实际上与“shared_ptr&lt;Foo&gt;”共享所有权。所有这一切中只有一个底层对象,但别名构造函数让我们拥有一个指向成员的“shared_ptr”。 (2认同)
  • 请记住,这里需要`const`。定期参考不会延长临时人员的寿命 (2认同)