저는 C++을 배우고 있습니다. 복사 초기화 및 복사 할당을 이해할 수있는 몇 가지 테스트 코드를 작성했습니다. 이제 두 번째 할당이 작동하지 않는 이유를 알 수 없습니다.복사 초기화가 작동하지 않습니까?
답변
rvalue은으로 수정할 수 없으며,이 경우에는 const 참조 const Test& obj
으로 처리해야합니다. 따라서 t1
을 test
으로 변환하면 이됩니다. 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) ...
복사 생성자는 원본 개체를 수정할 수 있으며 const 참조를 받아 들일 필요가 없습니다. –
@ M.M 갑자기 무엇이 잘못되었는지 깨달았다. 그것을 수정했습니다. – iBug
복사 생성자를 사용하면 복사 할 개체를 수정할 수 있습니다.
문
Test t2 = func(t1);
임시로 func()
의 반환 값을 저장 한 다음 t2
에 있음을 복사합니다. 그러나 const
참조에 임시로 바인딩 할 수 없으므로 복사 생성자에 const
참조를 허용해야합니다.
(기술적으로 컴파일러에서 임시를 삭제할 수 있지만 일시적으로 생성되었다고 가정하면 코드에 대한 진단을 실행해야합니다. 즉 복사 생성자는 const
이어야합니다.
const
참조를 허용하도록 복사본 생성자를 변경하십시오. "타입의 const가 아닌 참조의 잘못된 초기화 :
Test(Test const &obj) {
- 1. VB.NET 개체 초기화가 작동하지 않습니까?
- 2. for 루프 초기화가 작동하지 않습니까?
- 3. FB JS SDK : 초기화가 작동하지 않습니까?
- 4. 참조 유형의 초기화가 올바르지 않습니까?
- 5. 복사 생성자가 작동하지 않습니까?
- 6. POD 변수의 직접 초기화가 작동하지 않지만 변수를 벡터에 푸시 할 때 복사 초기화가 수행됩니다.
- 7. 개체 초기화가 작동하지 않습니다.
- 8. 복사 목록 초기화가 개념적으로 복사기를 호출합니까?
- 9. nitrous webIDE에서 복사 붙여 넣기가 작동하지 않습니까?
- 10. 파일 복사 작업이 별도의 스레드에서 작동하지 않습니까?
- 11. Select2 재 초기화가 작동하지 않습니다.
- 12. 차트 초기화가 제대로 작동하지 않습니다.
- 13. Safari에서 웹캠 초기화가 작동하지 않습니다.
- 14. 컨트롤러에서 리디렉션 초기화가 작동하지 않음
- 15. Junit Spring 초기화가 작동하지 않습니다.
- 16. 초기화가 null로 초기화되는 것과 같지 않습니까?
- 17. while 루프에서는 변수 초기화가 유효하지 않습니까?
- 18. 초기화가 PDFPage 하위 클래스에서 호출되지 않습니까?
- 19. OOP, 왜 개체 초기화가 올바르지 않습니까?
- 20. 봄 3.0 지연 초기화가 DefaultMessageListenerContainer에 적합하지 않습니까?
- 21. 초기화가
- 22. NSTimer가 작동하지 않습니까?
- 23. 벡터 <unique_ptr> 초기화가 복사 오류로 인해 실패합니다.
- 24. UIColor 확장 편의 초기화가 작동하지 않습니다.
- 25. 외부 데이터에서 Dynatree 초기화가 작동하지 않습니다.
- 26. 코코아 터치 NSArray 초기화가 제대로 작동하지 않습니다.
- 27. 왜 bitwise는 복사/붙여 넣기 문자열에서 작동하지 않습니까?
- 28. File :: Windows의 드라이브 간 복사 디렉토리 이동이 작동하지 않습니까?
- 29. 왜 로컬로 복사 된 aspx/cs 프로젝트가 작동하지 않습니까?
- 30. 생성자 초기화가
복사 생성자의 서명이 잘못,'시험 (const를 테스트 및 OBJ)'하지'테스트 (테스트 및 OBJ)' – Galik
컴파일러는 큰 소리로 알려줍니다하고 명확해야 '테스트&' ". 따라서 복사 생성자의 매개 변수를 const 참조 (정상적인 경우)로 만들고 작동하게됩니다. – Rene
@ 갤릭 감사합니다. 지금 작동합니다! –