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取决于呼叫者的实现详细信息。与所有权不相互作用的代码不应取决于智能指针,因为它们的唯一目的是建模所有权。