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行都没有编译,但第三行不会导致任何编译错误 - 显然第一次初始化引用并传递它没有问题;该问题仅在我第二次尝试分配时出现。
我无法理解幕后发生的事情,这使得第二次任务变得不可能。
答案 0 :(得分:6)
这与引用无关,它是无法复制的unique_ptr
。
unique_ptr<int> p1, p2;
p1 = p2; // error
因此,unique_ptr
的向量也无法复制。
vector<unique_ptr<int>> vec1, vec2;
vec1 = vec2; // error
答案 1 :(得分:4)
问题是您要将vec1
分配给vec2
,而这是无法完成的,因为向量的内容不可分配。
此
otherReference=vec2;
与
完全相同vec1 = vec2;
因为otherReference
是vec1
的别名。无论您在表达式中看到otherReference
,都可以将其替换为vec1
。
答案 2 :(得分:0)
初始化引用非常与分配不同。当初始化引用时,将其设置为引用对象。此后到处,使用引用实际上意味着使用引用的对象。这意味着分配给“引用”实际上意味着分配给引用的对象。
在您的情况下,分配是非法的,因为std::unique_ptr
无法复制(因此,通过扩展,当然也不能复制它们。)