可以使用对 shared_ptr 拥有的对象的引用吗?

Is it OK to use reference to the object owned by a shared_ptr?

我发现它运行良好,但不知道这是否安全,因为我不明白它为什么起作用:

struct X{
  static X& make(){
    return *std::make_shared<X>();
  }
  ...
}

int main(){
   const auto& a = X::make();
   a.function();
   ...
   // seems like the instance holds and nothing broken
}

根据我的理解,从 shared_ptr operator* 中返回的对取消引用对象的引用不应该影响 shared_ptr 管理实例引用计数的方式:所以在 make() 应该在 make() 完成后销毁。但是这种代码模式多次运行良好,我不明白为什么。所以我不确定我们是否真的可以用这种方式做到...感谢任何评论!

不,从 make_shared 编辑的共享指针 return 在 return 之后立即销毁,因此通过取消引用它获得的引用将是悬空的。它可能 看起来 好像有效,但它实际上只是未定义的行为,正如评论中所说,未定义是未定义的。