将const unique_ptr引用作为参数传递

cod*_*ode 2 c++ smart-pointers c++11 c++14

 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);
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,调用f1是危险的,因为被调用者可以通过重置智能指针,释放它等来搞乱智能指针等.调用f2是安全的,一切都很好.如果被调用者试图做坏事,编译器会抓住它.这样,当调用堆栈展开并且我们回到调用者时,智能指针就是声音.

重要的是,我不是问最好的智能指针传递方式(我意识到常规原始指针void f3(A*pAArray){}会没问题.我在问f2有什么问题?一般的建议是不要使用const引用unique_ptr作为参数,虽然我知道为什么这不是最优,我不明白为什么它比f1()更糟糕.

简而言之,具体而言,反对f2()的理由是什么?它做坏事吗?它似乎安然无恙(虽然肯定不是最佳的),我不明白它为何如此糟糕.

amc*_*176 6

通过const引用(或原始引用)传递智能指针的缺点之一是被调用者依赖于调用者的实现细节.不与所有权交互的代码不应该依赖于智能指针,因为它们的唯一目的是建模所有权.

  • @code他意味着你知道调用者将使用`std :: unique_ptr`,所以你编写你的函数来接受它,从而将它们耦合在一起.如果函数只需要数组那么你就应该采取这种方式,你不应该关心如何存储/管理该数组. (3认同)