使用std :: unique_ptr <T>而不是std :: unique_ptr <T>有什么好处吗?

InF*_*s X 4 c++ unique-ptr

使用std::unique_ptr<T>&而不是std::unique_ptr<T>?例如,在函数参数中?

Cal*_*eth 9

有几种不同的情况

  1. 您想将所有权转移到该功能
    • 使用 std::unique_ptr<T>
  2. 您希望允许该函数修改指针
    • 使用 std::unique_ptr<T> &
  3. 您希望允许该函数修改指针
    • T &在呼叫站点使用和取消引用
    • 如果指针可能为null,则使用T *unique_ptr::get在调用站点调用
  4. 您希望允许该函数观察指针
    • const T &在呼叫站点使用和取消引用
    • 如果指针可能为null,则使用const T *unique_ptr::get在调用站点调用
  5. 您希望允许该函数具有指针的副本
    • T在呼叫站点使用和取消引用
  6. 你有一个ranged-for循环(或<algorithm>调用)集合unique_ptr<T>,并希望观察值,并没有ranges::indirect(或类似)
    • 使用auto &,并知道它被推断为std::unique_ptr<T> &(或者const std::unique_ptr<T> &如果集合是const),所以你必须在循环体中取消引用


Kap*_*pil 1

std::unique_ptr 只能移动,因此如果您按值传递 unique_ptr,那么您无法在函数调用后提取其内容,但如果您按引用传递,则可以检索值。下面是相同的示例代码:

#include <iostream>
#include <memory>
void changeUniquePtrReference(std::unique_ptr<int>& upr)
{
    *upr = 9;   
}
void changeUniquePtrValue(std::unique_ptr<int> upv)
{
    *upv = 10;
}
int main()
{
  std::unique_ptr<int> p(new int);
  *p =8;
  std::cout<<"value of p is "<<*p<<std::endl;
  changeUniquePtrReference(p);
  std::cout<<"value of p is "<<*p<<std::endl;
  changeUniquePtrValue(std::move(p));
  std::cout<<"Memory deallocated so below line will crash.. "<<std::endl;
  std::cout<<"value of p is "<<*p<<std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)