개인 생성자가 개인 생성자가 아닌 경우는 언제입니까?
C에서는 생성자를 비공개로 만드는 것이 객체 생성을 방지하는 간단한 방법처럼 보입니다. 수업 밖에서. 그러나 기본 생성자가 비공개로 선언되면 예기치 않은 동작이 발생합니다.
다음 코드를 고려하세요.
class C { C() = default; }; int main() { C c; // Error: Private constructor auto c2 = C(); // Error: Private constructor }
놀랍게도 이 코드는 비공개 기본 생성자로 인해 컴파일에 실패합니다. 그러나 다음 코드는
class C { C() = default; }; int main() { C c{}; // Compiles auto c2 = C{}; // Compiles }
컴파일에 성공했습니다.
이 특이한 동작의 이유는 C 표준에 있습니다. 8.4.2/5 [dcl.fct.def.default]에 따르면, 첫 번째 선언에서 명시적으로 기본값이 설정된 경우 함수는 사용자가 제공하지 않습니다. 따라서 초기 예에서 기본 생성자는 사용자가 제공하지 않습니다.
이러한 사용자 제공 생성자가 없기 때문에 클래스 C는 8.5.1/1 [dcl.init.aggr]에 따라 집계됩니다.
집계의 경우 Braced-init 구문은 선언이 아닌 생성자 호출로 간주되므로 후자의 코드 조각에서 성공합니다.
위 내용은 개인 기본 생성자가 C에서 개체 생성을 방지하지만 중괄호 초기화가 작동하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!