답변:
다음에서 "자동 생성"은 "암시 적으로 기본값으로 선언되었지만 삭제 된 것으로 정의되지 않음"을 의미합니다. 특수 멤버 함수가 선언되었지만 삭제 된 것으로 정의 된 상황이 있습니다.
const
클래스에 멤버 가 있으면 생성자가 자동 생성되는 것을 막을 수 있다고 언급해야한다고 생각합니다 .
아래 다이어그램이 매우 유용하다는 것을 알았습니다.
= delete
(명백하게) 또는 = default
(나에게 덜 명확하게 ) 설정하는 두 가지 경우가 포함됩니다 . 내가 맞아?
C ++ 17 N4659 표준 초안
빠른 상호 표준 참조를 위해 다음 cppreference 항목의 "암시 적으로 선언 된"섹션을 살펴보십시오.
물론 동일한 정보를 표준에서 얻을 수 있습니다. 예를 들어 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)으로 선언됩니다. 암시 적으로 선언 된 소멸자는 해당 클래스의 인라인 공용 멤버입니다.