컴파일러가 일반적으로 기본 생성자, 복사 생성자 및 할당 연산자를 자동 생성하는 조건에서 메모리를 새로 고치고 싶습니다.
몇 가지 규칙이 있었지만 기억이 나지 않으며 온라인에서 평판이 좋은 자료를 찾을 수 없습니다. 누구든지 도울 수 있습니까?
답변
다음에서 “자동 생성”은 “암시 적으로 기본값으로 선언되었지만 삭제 된 것으로 정의되지 않음”을 의미합니다. 특수 멤버 함수가 선언되었지만 삭제 된 것으로 정의 된 상황이 있습니다.
- 사용자 선언 생성자가없는 경우 기본 생성자가 자동 생성됩니다 (§12.1 / 5).
- C ++ 03에는 이동 생성자 또는 이동 할당 연산자가 없기 때문에 사용자 선언 이동 생성자 또는 이동 할당 연산자가 없으면 복사 생성자가 자동 생성됩니다 (C ++ 03의 “항상”으로 단순화). §12.8 / 8).
- 사용자 지정 이동 생성자 또는 이동 할당 연산자가없는 경우 복사 할당 연산자가 자동 생성됩니다 (§12.8 / 19).
- 사용자가 선언 한 소멸자가없는 소멸자는 자동 생성됩니다 (§12.4 / 4).
C ++ 11 이상 만 :
- 사용자 생성 복사 생성자, 복사 할당 연산자 또는 소멸자가없고 생성 된 이동 생성자가 유효한 경우 (§12.8 / 10) 이동 생성자가 자동 생성됩니다.
- 사용자 지정 복사 생성자, 복사 할당 연산자 또는 소멸자가없고 생성 된 이동 할당 연산자가 유효한 경우 (예 : 상수 멤버를 할당 할 필요가없는 경우) 이동 할당 연산자는 자동 생성됩니다 (§12.8 / 21).
답변
아래 다이어그램이 매우 유용하다는 것을 알았습니다.
답변
C ++ 17 N4659 표준 초안
빠른 상호 표준 참조를 위해 다음 cppreference 항목의 “암시 적으로 선언 된”섹션을 살펴보십시오.
- https://en.cppreference.com/w/cpp/language/copy_constructor
- https://en.cppreference.com/w/cpp/language/move_constructor
- https://en.cppreference.com/w/cpp/language/copy_assignment
- https://en.cppreference.com/w/cpp/language/move_assignment
물론 동일한 정보를 표준에서 얻을 수 있습니다. 예를 들어 C ++ 17 N4659 표준 초안 :
15.8.1 “복사 / 이동 생성자”는 복사 생성자를 나타냅니다.
6 클래스 정의가 명시 적으로 복사 생성자를 선언하지 않으면 명시 적이 지 않은 것이 암시 적으로 선언됩니다. 클래스 정의가 이동 생성자 또는 이동 할당 연산자를 선언하면 암시 적으로 선언 된 복사 생성자가 삭제 된 것으로 정의됩니다. 그렇지 않으면 기본값 (11.4)으로 정의됩니다. 클래스에 사용자 선언 복사 할당 연산자 또는 사용자 선언 소멸자가 있으면 후자의 경우 더 이상 사용되지 않습니다.
이동 생성자 :
8 클래스 X의 정의가 이동 생성자를 명시 적으로 선언하지 않는 경우, 명시 적이 지 않은 것이 명시 적으로 선언 된 경우에만 기본값으로 선언됩니다.
(8.1) — X에는 사용자가 선언 한 복사 생성자가 없습니다.
(8.2) — X는 사용자가 지정한 복사 할당 연산자를 가지고 있지 않습니다.
(8.3)-X는 사용자가 지정한 이동 할당 연산자를 가지고 있지 않으며
(8.4) — X는 사용자가 선언 한 소멸자를 가지고 있지 않다.
15.8.2 “복사 / 이동 할당 연산자”는 복사 할당에 대해 말합니다.
2 클래스 정의가 복사 할당 연산자를 명시 적으로 선언하지 않으면 암시 적으로 선언됩니다. 클래스 정의가 이동 생성자 또는 이동 할당 연산자를 선언하면 암시 적으로 선언 된 복사 할당 연산자는 삭제 된 것으로 정의됩니다. 그렇지 않으면 기본값 (11.4)으로 정의됩니다. 클래스에 사용자 선언 사본 생성자 또는 사용자 선언 소멸자가 있으면 후자의 경우 더 이상 사용되지 않습니다.
그리고 이동 할당 :
4 클래스 X의 정의가 이동 할당 연산자를 명시 적으로 선언하지 않으면 다음과 같은 경우에만 암시 적으로 기본값으로 선언됩니다.
- (4.1) — X에는 사용자가 선언 한 복사 생성자가 없습니다.
- (4.2) — X는 사용자가 선언 한 이동 생성자를 가지고 있지 않습니다.
- (4.3) — X에는 사용자가 지정한 사본 할당 연산자가 없으며
- (4.4) — X에는 사용자가 선언 한 소멸자가 없습니다.
15.4 “소멸자”는 소멸자를 위해 다음과 같이 말합니다.
4 클래스에 사용자가 선언 한 소멸자가 없으면 소멸자는 암시 적으로 기본값 (11.4)으로 선언됩니다. 암시 적으로 선언 된 소멸자는 해당 클래스의 인라인 공용 멤버입니다.