>  기사  >  백엔드 개발  >  개인 기본 생성자가 C에서 개체 생성을 방지하지만 중괄호 초기화가 작동하는 이유는 무엇입니까?

개인 기본 생성자가 C에서 개체 생성을 방지하지만 중괄호 초기화가 작동하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-12 20:39:02763검색

Why Does a Private Default Constructor Prevent Object Creation in C   But Braced Initialization Works?

개인 생성자가 개인 생성자가 아닌 경우는 언제입니까?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.