使用std::unique_ptr<T>&而不是std::unique_ptr<T>?例如,在函数参数中?
有几种不同的情况
std::unique_ptr<T>std::unique_ptr<T> &T &在呼叫站点使用和取消引用T *并unique_ptr::get在调用站点调用const T &在呼叫站点使用和取消引用const T *并unique_ptr::get在调用站点调用T在呼叫站点使用和取消引用<algorithm>调用)集合unique_ptr<T>,并希望观察值,并没有ranges::indirect(或类似)
auto &,并知道它被推断为std::unique_ptr<T> &(或者const std::unique_ptr<T> &如果集合是const),所以你必须在循环体中取消引用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)