从 shared_ptr 访问引用变量

Accessing reference variable from shared_ptr

我不确定标题,如果不是很清楚,请提前致歉。

下面的例子说明了我的问题。

当我使用 new 从成员初始化列表中初始化 shared_ptr 然后当我为 &ref_bar 赋值时,一切似乎都有效美好的。然而,当我用 make_shared 尝试同样的事情时,这是首选的方式,它不起作用。

您能否解释一下发生这种情况的幕后原因?

请忽略下面例子中的"bad"编码。我创建这个是为了说明我的问题。我对 shared_ptr.

的重要性感兴趣
#include <iostream>
#include <memory>

class Bar
{
   int m_bar;

   public:
      int &ref_bar;

      Bar(int bar_) : m_bar(bar_),ref_bar(m_bar)
      {;}
      void print()
      {
         std::cout<< "m_bar = "<<m_bar<<std::endl;
      }
};

struct Foo
{
   std::shared_ptr<Bar> m_foo;

   Foo() : m_foo( std::make_shared<Bar>(Bar(23)) )   // Ex.1
   //Foo() : m_foo( new Bar(23) )                    // Ex.2
   {
      m_foo->print();
      m_foo->ref_bar = 12;
      m_foo->print();
   }
};

int main()
{
   Foo f;
}

结果是:

Ex.1 >> 23,23   Wrong.
Ex.2 >> 23,12   Ok.

这是一个 link 的想法:http://ideone.com/xluYQ9

在更改构造函数时已修复:

Foo() : m_foo( std::make_shared<Bar>(Bar(23)) )   // Ex.1

Foo() : m_foo( std::make_shared<Bar>(23) )   // Ex.1

在 make_shared 参数中调用构造函数有些问题。我仍然不知道为什么,所以如果有人对此有更多了解,请详细回答问题。