C++ 如何返回唯一的引用\u ptr<;派生>;来自unique_ptr<;基础>;?

C++ 如何返回唯一的引用\u ptr<;派生>;来自unique_ptr<;基础>;?,c++,c++11,inheritance,unique-ptr,c++20,C++,C++11,Inheritance,Unique Ptr,C++20,我在派生结构上使用unique_ptr,并返回引用以维护所有权并保持最小的开销 基本上,我需要一个get函数将unique\u ptr转换为unique\u ptr& 我无法使用动态\u指针\u强制转换,因为它复制并失败: 调用“动态指针强制转换(std::unique\u ptr&)”时没有匹配函数。 我不能使用std::move或release fromobj,因为它是程序真实性的来源 你们有别的选择吗? 共享的ptr版本工作正常顺便说一句,它是唯一的路径吗 提前感谢您的投入。 法学博士

我在派生结构上使用unique_ptr,并返回引用以维护所有权并保持最小的开销

基本上,我需要一个get函数将
unique\u ptr
转换为
unique\u ptr&

  • 我无法使用动态\u指针\u强制转换,因为它复制并失败:
    调用“动态指针强制转换(std::unique\u ptr&)”时没有匹配函数。
  • 我不能使用std::move或release from
    obj
    ,因为它是程序真实性的来源
你们有别的选择吗? 共享的ptr版本工作正常顺便说一句,它是唯一的路径吗

提前感谢您的投入。 法学博士

#包括
结构基{
};
结构派生:公共基{
浮动位置;
派生(浮点位置){
};
//真理之源
std::唯一对象;
//从obj检索
模板
std::unique_ptr&get(){
标准::唯一性\u ptr&p=obj;

return std::dynamic_pointer_cast(p);//您仍然可以使用原始指针执行常规的
dynamic_cast
,即:

template<typename T>
T* get() {
    std::unique_ptr<Base> &p = obj;
    return dynamic_cast<T*>(p.get());
}
模板
T*get(){
标准::唯一性\u ptr&p=obj;
返回动态_cast(p.get());
}

语义上,这是可以的,因为原始指针被认为是非拥有的。

您仍然可以对原始指针执行常规的
动态\u cast
,即:

template<typename T>
T* get() {
    std::unique_ptr<Base> &p = obj;
    return dynamic_cast<T*>(p.get());
}
模板
T*get(){
标准::唯一性\u ptr&p=obj;
返回动态_cast(p.get());
}

从语义上来说,这是ok的,因为原始指针被认为是非所有权的。

get
应该返回一个非所有权指针,因为它不应该更改所有权

template<typename T>
T * get() {
    return std::dynamic_cast<T *>(obj.get());
}
模板
T*get(){
返回std::dynamic_cast(obj.get());
}

get
应该返回一个非所有权指针,因为它不应该更改所有权

template<typename T>
T * get() {
    return std::dynamic_cast<T *>(obj.get());
}
模板
T*get(){
返回std::dynamic_cast(obj.get());
}
简短回答:不要! 长答案:唯一指针处理所有权,引用没有所有权语义。您可以返回(const)引用。如果需要共享所有权,请使用std::shared_指针。

短答案:不要!
详细回答:唯一指针处理所有权,引用没有所有权语义。您可以返回(const)引用。如果您需要共享所有权,请使用std::shared_pointer。

您可以返回一个指针或对保存在unique_ptr中的对象的引用。传递非所有权指针非常好,只要您从不手动
删除
任何内容您可以返回一个指针或对保存在unique_ptr中的对象的引用相反,他是独一无二的。只要你从不手动
delete
任何东西,就可以传递非所有权指针。我不会假设
obj
指向任何东西,更不用说
t
了,谢谢你的主意。我必须在Base中添加一个虚拟函数,否则它会拒绝动态转换(非多态性上无强制转换)。似乎现在就可以完成任务了。将测试并接受。@JBDumont您的
Base
类应该有一个虚拟析构函数,它将足以满足
动态强制转换
,同时还确保当
unique\u ptr
删除
Base*
指针时,它将正确调用
派生的
析构函数。我不认为t
obj
is指向任何东西,更不用说a
t
了,谢谢你的主意。我不得不在Base中添加一个虚拟函数,否则它会拒绝动态转换(非多态性上不转换)。似乎现在就可以做了。将测试并接受。@JBDumont您的
Base
类应该有一个虚拟析构函数,它将足以满足
动态
,同时还确保当
unique\u ptr
删除
Base*
指针时,它将正确调用
派生的
析构函数。我明白您的意思了。I just想在当地借钱,但如果业主去世,我们是SF。在我的情况下,业主的寿命会更长(我没有提到)所以应该没问题。对于短期业主,我会坚持你提醒我的共享产权。我明白你的意思。我只是想在当地借钱,但如果业主去世,我们是SF。在我的情况下,业主的寿命会更长(我没有提到),所以应该没问题。对于短期业主,我会坚持你提醒我的共享产权。