是否可以 return 引用静态或动态指针转换的结果?

Is it possible to return a reference to the result of a static or dynamic pointer cast?

假设我有以下功能:

    template<typename T>
    std::shared_ptr<T> resourceAs() const {
        return std::static_pointer_cast<T>(m_resource);
    }

这行得通。但是,如果我不喜欢创建 shared_ptr 的小开销怎么办?如果我想要这样的东西怎么办

    template<typename T>
    const std::shared_ptr<T>& resourceAs() const {
        return std::static_pointer_cast<T>(m_resource);
    }

所以,这里的问题是编译器会对我返回一个局部变量不满意。有没有一种安全的方法可以将 reference 返回到我的成员类型的强制转换指针?我的直觉告诉我不是,但我很好奇。

std::static_pointer_cast<T>(m_resource);

这个函数调用return是一个对象,而不是对对象的引用。

std::static_pointer_cast 将现有的 std::shared_ptr 作为参数,并创建一个新的 std::shared_ptr 对象(用于不相关的特定目的)。它不是 return 对现有 std::shared_ptr 的引用,而是一个新的 std::shared_ptr 对象。

因此,如果从 std::static_pointer_cast<T> 编辑的 return 存储在某个变量中,就会发生这种情况。否则,它会被销毁。

在 C++ 中,获取对对象的引用并不会阻止底层对象在正常销毁时被销毁(此规则有一个迂腐的例外,即临时对象生命周期延长规则,但它不适用于此处).

您尝试的替代方法 resourceAs() 获得了对 returned std::shared_ptr 的引用,并 return 引用了它。但是,由于这个 std::shared_ptr(从 std::static_pointer_cast 编辑而来的 return)实际上并没有存储在任何地方然后被销毁,就像声明为 resourceAs() 本地的任何其他对象一样从此函数 return 后被销毁。

这不是 std::shared_ptr 特有的东西,这是所有对象在 C++ 中的工作方式,同样的事情也会发生在 C++ 中的任何其他对象上,这些对象具有相同的过程:

class apple {

     // ...

};

apple buy_a_fruit();

const apple &what_i_bought()
{
     return buy_a_fruit();
}

what_i_bought() return 是对从 buy_a_fruit() 中 return 编辑的对象的引用,但该对象本身被销毁了,给您留下了对已销毁对象的引用.

结果引用没有有效的用法。现代 C++ 编译器足够智能,可以检测到此错误并发出诊断警报。