2017-10-05 1 views
-1

저는 C++을 배우고 있습니다. 복사 초기화 및 복사 할당을 이해할 수있는 몇 가지 테스트 코드를 작성했습니다. 이제 두 번째 할당이 작동하지 않는 이유를 알 수 없습니다.복사 초기화가 작동하지 않습니까?

+6

복사 생성자의 서명이 잘못,'시험 (const를 테스트 및 OBJ)'하지'테스트 (테스트 및 OBJ)' – Galik

+0

컴파일러는 큰 소리로 알려줍니다하고 명확해야 '테스트&' ". 따라서 복사 생성자의 매개 변수를 const 참조 (정상적인 경우)로 만들고 작동하게됩니다. – Rene

+0

@ 갤릭 감사합니다. 지금 작동합니다! –

답변

2

rvalue으로 수정할 수 없으며,이 경우에는 const 참조 const Test& obj으로 처리해야합니다. 따라서 t1test으로 변환하면 이됩니다. t1은 왼쪽 값이므로 t2을 반환 값 (즉, rvalue로 분류)에서 구해서는 안되기 때문에 문제가되지 않습니다.

요약하면 lvalues ​​만 허용하기 때문에 복사 생성자의 서명이 잘못되었습니다.

다음 10 행의 패치가 코드를 작동시킵니다.

Test(const Test &obj) { 
    ^~~~~ 

다음은 cppreference.com에서 copy constructor에 관한 기사입니다. 구문 섹션을 참조하십시오.
또한 r- 수치가 하는데 사용될 수있다

를 판독 rvalue 문서는 r- 수치에 의해 식별 된 객체의 수명 기준 단부의 영역까지 연장되어있는 경우에 CONST 좌변 참조를 초기화 .



P.S. rvalues ​​만 허용하는 move semantics (C++ 11)도 사용할 수 있습니다. 다음과 같은 이동 생성자를 작성하는 것은 어렵지 않습니다.

Test(Test&& obj) ... 
+0

복사 생성자는 원본 개체를 수정할 수 있으며 const 참조를 받아 들일 필요가 없습니다. –

+0

@ M.M 갑자기 무엇이 잘못되었는지 깨달았다. 그것을 수정했습니다. – iBug

1

복사 생성자를 사용하면 복사 할 개체를 수정할 수 있습니다.

Test t2 = func(t1); 

임시로 func()의 반환 값을 저장 한 다음 t2에 있음을 복사합니다. 그러나 const 참조에 임시로 바인딩 할 수 없으므로 복사 생성자에 const 참조를 허용해야합니다.

(기술적으로 컴파일러에서 임시를 삭제할 수 있지만 일시적으로 생성되었다고 가정하면 코드에 대한 진단을 실행해야합니다. 즉 복사 생성자는 const이어야합니다.

const 참조를 허용하도록 복사본 생성자를 변경하십시오. "타입의 const가 아닌 참조의 잘못된 초기화 :

Test(Test const &obj) { 
관련 문제