为什么引用unique_ptr的行为如此?

时间:2013-07-23 18:27:29

标签: c++ reference unique-ptr

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行都没有编译,但第三行不会导致任何编译错误 - 显然第一次初始化引用并传递它没有问题;该问题仅在我第二次尝试分配时出现。

我无法理解幕后发生的事情,这使得第二次任务变得不可能。

3 个答案:

答案 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;

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

答案 2 :(得分:0)

初始化引用非常与分配不同。当初始化引用时,将其设置为引用对象。此后到处,使用引用实际上意味着使用引用的对象。这意味着分配给“引用”实际上意味着分配给引用的对象。

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