기본 / 복사 / 이동 ctor 및 복사 / 이동 할당 연산자 자동 생성 조건? 일반적으로 기본 생성자, 복사 생성자 및

컴파일러가 일반적으로 기본 생성자, 복사 생성자 및 할당 연산자를 자동 생성하는 조건에서 메모리를 새로 고치고 싶습니다.

몇 가지 규칙이 있었지만 기억이 나지 않으며 온라인에서 평판이 좋은 자료를 찾을 수 없습니다. 누구든지 도울 수 있습니까?



답변

다음에서 “자동 생성”은 “암시 적으로 기본값으로 선언되었지만 삭제 된 것으로 정의되지 않음”을 의미합니다. 특수 멤버 함수가 선언되었지만 삭제 된 것으로 정의 된 상황이 있습니다.

  • 사용자 선언 생성자가없는 경우 기본 생성자가 자동 ​​생성됩니다 (§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 ++ 규칙
에서 스티커 비트 – 제로 영웅의 규칙되기


답변

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)으로 선언됩니다. 암시 적으로 선언 된 소멸자는 해당 클래스의 인라인 공용 멤버입니다.


답변