为什么引用unique_ptr会以这种方式行事

Why does referencing an unique_ptr behave this way?

本文关键字:方式行 引用 unique ptr 为什么      更新时间:2023-10-16
vector<int> v1, v2;
/*1*/        vector<int> &someReference=v1;     //compiles
/*2*/        someReference=v2;         //compiles
vector<unique_ptr<int>> vec1, vec2;
/*3*/        vector<unique_ptr<int>> &otherReference=vec1;    //compiles
/*4*/        otherReference=vec2;     //ERROR

如果第 3 行和第 4 行都没有编译,我会理解,但第三行不会导致任何编译错误 - 显然第一次初始化引用并传递它没有问题; 问题仅在我尝试第二次分配它时出现。

我不明白幕后发生了什么,使第二个任务无法完成。

这与引用无关,这是无法复制的unique_ptr

unique_ptr<int> p1, p2;
p1 = p2; // error

因此,unique_ptr的向量也无法复制。

vector<unique_ptr<int>> vec1, vec2;
vec1 = vec2; // error

问题是你正在将vec1分配给vec2,而这无法完成,因为向量的内容是不可分配的。

otherReference=vec2; 

vec1 = vec2;

因为otherReferencevec1的别名。无论在表达式中看到otherReference的任何地方,都可以将其替换为 vec1

初始化引用与赋值有很大不同。初始化引用时,将其设置为引用对象。此后,使用引用实际上意味着使用引用的对象。这意味着分配给"引用"实际上意味着分配给引用对象。

在您的情况下,分配是非法的,因为std::unique_ptr无法复制(因此,当然,它们的向量也不能复制(。