是否可以 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++ 编译器足够智能,可以检测到此错误并发出诊断警报。
假设我有以下功能:
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++ 编译器足够智能,可以检测到此错误并发出诊断警报。