将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是危险的,因为Callee可以通过重置,释放它等来弄乱智能指针。调用F2是安全的,一切都很好。如果Callee试图做一些不好的事情,请抓住它。这样,当呼叫堆栈放开时,智能指针是合理的,我们回到了呼叫者。
重要的是,我不是在问如何最好地通过智能指针(我意识到常规的原始指针void f3(a* paarray({}没关系。我问F2有什么问题?一般建议是要不使用const ref to unique_ptr作为参数,而我知道为什么这不是最佳的,但我不知道为什么它比f1((。
。简而言之,针对F2((的理由是什么?它做得不好吗?它看起来很安全(肯定不是最佳(,我不明白为什么它这么糟糕。
关于通过const参考传递智能指针(或原始参考(的缺点之一是callee取决于呼叫者的实现详细信息。与所有权不相互作用的代码不应取决于智能指针,因为它们的唯一目的是建模所有权。
相关文章:
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 通过常量引用传递参数的矩阵模板类
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- 具有常量引用参数的函数模板专用化
- 作为参数引用
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 如何传递带有通过引用传递的结构参数的函数?
- 将输入参数作为右值引用传递?
- 使用引用与指针将数组作为参数传递
- 根据模板参数引用不同基类的函数
- 默认情况下C++数组作为参数引用
- 对指针C++的参数引用
- 作为非类型模板参数引用
- 重用返回语句或按参数引用返回
- 将参数引用传递给函数C++
- 从另一个参数引用的模板可变参数
- 成员变量多态性和参数引用
- 按参数引用或按参数引用之间的差异
- 无法实例化抽象类:为什么模板参数(引用)导致这种情况