비공개 생성자와 집계 초기화: 예상치 못한 상호 작용
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!