2013-07-23 4 views
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도 컴파일되지 않았지만 세 번째 컴파일 오류가 발생하지 않는지 이해할 수 있습니다. 처음으로 참조를 초기화하고 주위를 전달하는 데 문제가없는 것 같습니다. 문제는 두 번째 할당하려고 할 때만 나타납니다.unique_ptr을 참조하는 것이 왜 이런 식으로 동작합니까?

두 번째 할당을 불가능하게 만드는 장면 뒤에 무엇이 일어나고 있는지 이해할 수 없습니다.

+1

google "이동 의미" –

답변

6

이것은 참조와 관계가 없으며 복사 할 수없는 unique_ptr입니다.

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

따라서 unique_ptr의 벡터도 복사 할 수 없습니다. 기준 초기화 방법

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

맞아요, 바보 같은 실수였습니다. 그것이 참조 자체를 변경하는 것은 불가능하다는 것을 의미합니다. 너무 나쁘다. – Adrian17

+2

@ Adrian17 맞습니다. 참조는 다른 것에 대한 별칭이며, 항상 그 것에 바인딩됩니다. 별칭을 변경할 수 없습니다. – juanchopanza

+0

@ Adrian17'T & const'(참조 : 포인터는'const'이고 우리가 가리키는 것은 그렇지 않습니다)는'operator ='를 역 참조 배정 (dereference-and-assign) 다른 연산자를'.'에서'+'까지) 호출하고 생성자를 take-address-of-and-store로 오버라이드합니다. 그럼에도 불구하고 이것은 완벽한 모델은 아니지만 그럼에도 불구하고 유용한 모델입니다. 또는 copy/construct/move/move-construct에 대한 포인터 -vs-reference-vs-value 의미에 대해 이야기 할 수 있습니다. – Yakk

4

vec1vec2을 할당하는 것은 문제이며, 벡터의 내용을 할당 할 수 없기 때문에이 작업을 수행 할 수 없습니다. otherReferencevec1의 별칭이기 때문에

otherReference=vec2; 

정확히

vec1 = vec2; 

과 동일합니다. 식에 otherReference이 표시되는 곳이면 vec1으로 바꿀 수 있습니다.

0

그것에 할당 매우 다른 이다. 초기화시 참조를 초기화하면 객체를 참조하도록 설정합니다. 이후 모든 곳에서 참조를 사용한다는 것은 실제로 참조 된 객체를 사용한다는 것을 의미합니다. 즉, "참조"에 할당한다는 것은 실제로 참조 된 객체에 할당하는 것을 의미합니다.

std::unique_ptr을 복사 할 수 없기 때문에 귀하의 경우 할당이 불법입니다 (따라서 확장자에 따라 벡터도 복사 할 수 없으므로).

관련 문제