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

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

4

3 回答 3

6

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

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

因此,向量unique_ptr也不能被复制。

vector<unique_ptr<int>> vec1, vec2;
vec1 = vec2; // error
于 2013-07-23T18:29:52.207 回答
4

问题是您要分配vec1vec2,这是无法完成的,因为向量的内容不可分配。

这个

otherReference=vec2; 

完全一样

vec1 = vec2;

因为otherReference是 的别名vec1。无论您otherReference在表达式中看到什么位置,都可以将其替换为vec1.

于 2013-07-23T18:29:35.240 回答
0

初始化引用与分配给它有很大不同。当你初始化一个引用时,你将它设置为引用一个对象。此后的任何地方,使用引用实际上都意味着使用被引用的对象。这意味着分配给“引用”实际上意味着分配给被引用的对象。

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

于 2013-07-23T18:30:13.880 回答