기본 생성자의 Private Shadow
기본 생성자를 비공개로 만들려는 의도로 유형을 선언할 때 default 키워드를 사용하면 다음 코드 조각에 설명된 대로 원하는 결과를 얻을 수 있습니다.
class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); // error: as above }
놀랍게도 이 코드는 명시적으로 생성자를 비공개로 설정했음에도 불구하고 오류를 생성합니다. 그러나 다음 코드는 성공적으로 컴파일됩니다.
class C { C() = default; }; int main() { C c{}; // OK on all compilers auto c2 = C{}; // OK on all compilers }
중괄호와 함께 사용할 때 생성자가 다르게 동작하는 이유는 무엇입니까?
C 14 기본 생성자 기본값
핵심은 C 14 표준(8.4.2/5 [dcl.fct.def.default])에 있습니다. 이 표준은 "사용자 제공" 함수를 "사용자가 선언하고 명시적으로 기본값으로 설정하거나 삭제하지 않는 함수"로 정의합니다. 첫 번째 선언에서." 이는 우리 예제의 기본 생성자가 명시적으로 기본값이 지정되었기 때문에 사용자가 제공한 것으로 간주되지 않음을 의미합니다.
집계 생성자 조명
결과적으로 클래스 C는 사용자가 제공한 생성자가 없습니다. 따라서 이는 8.5.1/1 [dcl.init.aggr]에 따라 집계로 분류됩니다. 이는 집계가 "사용자 제공 생성자가 없는 배열 또는 클래스, 개인용 또는 보호된 비정적 없음"이라고 명시합니다. 데이터 멤버가 없고 기본 클래스가 없으며 가상 함수가 없습니다."
중괄호를 사용한 집계 구성
집계에는 중괄호를 사용하여 구성할 수 있는 특별한 구성 규칙이 있습니다. {} 비공개 생성자가 있는 경우에도 마찬가지입니다. 이 규칙은 일반적으로 여러 멤버를 포함하는 배열 및 구조체와 같은 집계의 초기화를 단순화하기 위한 것입니다.
따라서 클래스 C의 생성자는 비공개로 표시되어 있지만 다음과 같은 이유로 중괄호 내에서 계속 사용할 수 있습니다. 클래스 자체는 집합체로 간주됩니다.
위 내용은 C의 비공개 기본 생성자가 중괄호와 함께 사용하면 작동하지만 괄호와 함께 사용하면 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!