C++ 使用对共享ptr拥有的对象的引用是否可以?

C++ 使用对共享ptr拥有的对象的引用是否可以?,c++,c++11,reference,c++14,shared-ptr,C++,C++11,Reference,C++14,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 } st

我发现这很有效,但不知道这是否安全,因为我不明白它为什么有效:

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
}
struct X{
静态X&make(){
return*std::make_shared();
}
...
}
int main(){
常量auto&a=X::make();
a、 函数();
...
//似乎这个例子成立,没有什么坏的
}

根据我的理解,从
shared\u ptr
operator*
返回的对已撤销对象的引用不应该影响
shared\u ptr
如何管理实例的引用计数:因此
make()
中创建的实例应该在
make()
完成后销毁。但是这种代码模式已经运行了很多次,我不明白为什么。所以我不确定我们是否真的可以这样做。。。感谢您的评论

否,从
make_shared
返回的共享指针在返回后立即被销毁,因此通过取消引用获得的引用将悬空。它可能看起来有效,但实际上只是未定义的行为,正如注释中所述,未定义的行为是未定义的。

未定义的行为是未定义的。“但这种代码模式已经运行了很多次,我不明白为什么。”-幸运。也许您正在引用的内存碰巧仍然包含相同的数据,但它随时都可能被覆盖。为什么不返回共享指针呢?感谢Martin的提问,我正在使用DSL API在一条语句中链接一些操作,例如:–auto query=table(“name”).select(…).groupby(…).sortby(…).limit(10);我希望在这些函数调用之间避免->操作,因此我可以选择为table()返回对象本身,但对象可能会在方法链之后很快被销毁,如果我允许对链中的每个调用进行对象复制,我想它应该可以工作。所以我在寻找方法,如果我可以为每个函数保留对象引用类型,但仍然保留对象,那么我发现上面的模式可以工作,并且正在寻找关于它的意见。确实如此。如果有人不相信,演示如下: