将 const unique_ptr 引用作为参数传递
Passing const unique_ptr reference as parameter
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 是危险的,因为被调用者可以通过重置、释放智能指针等方式弄乱智能指针。调用 f2 是安全的,并且一切正常。如果被调用者试图做坏事,编译器会捕获它。这样,当调用堆栈展开并且我们返回到调用者时,智能指针是正确的。
重要,我不是在问如何最好地传递智能指针(我意识到常规的原始指针 void f3(A* pAArray){} 会很好。我是在问 f2 有什么问题?一般建议不要使用 unique_ptr 的 const ref 作为参数,虽然我明白为什么这不是最佳的,但我不明白为什么它比 f1() 更糟糕。
简而言之,具体来说,反对 f2() 的理由是什么?它做了坏事吗?看起来很安全(虽然肯定不是最优的),我不明白为什么这么糟糕。
通过 const 引用(或原始引用)传递智能指针的缺点之一是被调用者依赖于调用者的实现细节。不与所有权交互的代码不应依赖于智能指针,因为它们的唯一目的是建模所有权。
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 是危险的,因为被调用者可以通过重置、释放智能指针等方式弄乱智能指针。调用 f2 是安全的,并且一切正常。如果被调用者试图做坏事,编译器会捕获它。这样,当调用堆栈展开并且我们返回到调用者时,智能指针是正确的。
重要,我不是在问如何最好地传递智能指针(我意识到常规的原始指针 void f3(A* pAArray){} 会很好。我是在问 f2 有什么问题?一般建议不要使用 unique_ptr 的 const ref 作为参数,虽然我明白为什么这不是最佳的,但我不明白为什么它比 f1() 更糟糕。
简而言之,具体来说,反对 f2() 的理由是什么?它做了坏事吗?看起来很安全(虽然肯定不是最优的),我不明白为什么这么糟糕。
通过 const 引用(或原始引用)传递智能指针的缺点之一是被调用者依赖于调用者的实现细节。不与所有权交互的代码不应依赖于智能指针,因为它们的唯一目的是建模所有权。