> 백엔드 개발 > C++ > 프라이빗 기본 생성자를 사용하여 집계를 초기화할 수 있는 이유는 무엇입니까?

프라이빗 기본 생성자를 사용하여 집계를 초기화할 수 있는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-15 12:21:03
원래의
682명이 탐색했습니다.

Why Can I Initialize an Aggregate with a Private Default Constructor?

비공개 생성자와 집계 초기화: 예상치 못한 상호 작용

C에서 기본 생성자를 비공개로 선언하면 자연스럽게 연관된 유형의 기본 구성에 액세스할 수 없게 됩니다. 그러나 중괄호로 묶인 초기화 구문을 사용하면 특이한 동작이 나타납니다.

다음 예를 고려하세요.

class C {
    C() = default;
};

int main() {
    C c;           // error: C::C() is private
    auto c2 = C(); // error: calling a private constructor
}
로그인 후 복사

예기치 않게 위 코드는 모든 주요 컴파일러에서 오류를 생성합니다. 이는 기본 생성자가 실제로 비공개로 선언되었기 때문에 예상되는 동작입니다. 그러나 중괄호로 묶인 초기화를 사용하면 갑자기 기본 구성이 허용됩니다.

int main() {
    C c{};         // OK
    auto c2 = C{}; // OK
}    
로그인 후 복사

이 예상치 못한 동작의 이유는 C 표준 라이브러리의 복잡성에 있습니다. C 14 표준(8.4.2/5)에 따르면 함수가 사용자가 선언하고 첫 번째 선언에서 명시적으로 기본값으로 설정되거나 삭제되지 않은 경우 함수는 "사용자 제공"으로 간주됩니다.

위의 C 클래스에서 기본 생성자는 첫 번째 선언에서 명시적으로 기본값이 지정됩니다. 이는 "사용자 제공"으로 간주되지 않음을 의미합니다. 결과적으로 C 클래스에는 사용자 제공 생성자가 없으므로 8.5.1/1의 정의에 따라 집합이 됩니다.

An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).
로그인 후 복사

결과적으로 C 클래스에 대해 중괄호로 묶인 초기화가 허용됩니다. 생성자가 비공개로 선언된 경우에도 기본 생성을 허용하는 클래스입니다. 이러한 동작은 놀랄 수 있으며 특정 시나리오에서는 바람직하지 않은 결과를 초래할 수 있습니다.

위 내용은 프라이빗 기본 생성자를 사용하여 집계를 초기화할 수 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿