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行目もコンパイルされなかった場合は理解できますが、3行目はコンパイルエラーを引き起こしません-参照を初めて初期化して渡すことに問題はないようです。問題は、2 回目に割り当てようとしたときにのみ表示されます。

2番目の割り当てを不可能にする舞台裏で何が起こっているのか理解できません。

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

問題は、 に代入していることであり、ベクトルの内容が代入vec1できvec2ないため、これを行うことはできません。

これ

otherReference=vec2; 

とまったく同じです

vec1 = vec2;

otherReferenceは のエイリアスであるためですvec1。式のどこを見otherReferenceても、 で置き換えることができますvec1

于 2013-07-23T18:29:35.240 に答える
0

参照の初期化は、割り当てとは大きく異なります。参照を初期化するときは、オブジェクトを参照するように設定します。その後、参照を使用することは、実際には参照されたオブジェクトを使用することを意味します。つまり、「参照」への割り当ては、実際には参照先オブジェクトへの割り当てを意味します。

そして、あなたの場合、std::unique_ptrコピーできないため、割り当ては違法です(したがって、もちろん、それらのベクトルもコピーできません)。

于 2013-07-23T18:30:13.880 に答える