将const unique_ptr引用作为参数

Passing const unique_ptr reference as parameter

本文关键字:参数 引用 ptr const unique      更新时间:2023-10-16
 void f1(unique_ptr<A[]>& upA){
    //some work...
    //callee can mess up smart pointer many ways for caller    
    upA.reset();
    //some work...
}
void f2(const unique_ptr<A[]>& upA){
    //some work...
    //compiler stops callee from ruining smart pointer many ways for caller    
    upA.reset();
    //some work...
}
f1(upAArray);
f2(upAArray);

在上面的代码中,调用F1是危险的,因为Callee可以通过重置,释放它等来弄乱智能指针。调用F2是安全的,一切都很好。如果Callee试图做一些不好的事情,请抓住它。这样,当呼叫堆栈放开时,智能指针是合理的,我们回到了呼叫者。

重要的是,我不是在问如何最好地通过智能指针(我意识到常规的原始指针void f3(a* paarray({}没关系。我问F2有什么问题?一般建议是要不使用const ref to unique_ptr作为参数,而我知道为什么这不是最佳的,但我不知道为什么它比f1((。

简而言之,针对F2((的理由是什么?它做得不好吗?它看起来很安全(肯定不是最佳(,我不明白为什么它这么糟糕。

关于通过const参考传递智能指针(或原始参考(的缺点之一是callee取决于呼叫者的实现详细信息。与所有权不相互作用的代码不应取决于智能指针,因为它们的唯一目的是建模所有权。