C 20의 지정 이니셜라이저: 파생 클래스의 초기화
C 20에 도입된 지정 이니셜라이저는 다음을 사용하여 클래스 멤버의 정확한 초기화를 허용합니다. 지정된 초기화 목록. 그러나 최근 질문은 파생 클래스의 예기치 않은 동작을 밝혀줍니다.
질문:
다음 코드는 문제를 보여줍니다.
<code class="cpp">struct Person { std::string name{}; std::string surname{}; unsigned age{}; }; struct Employee : Person { unsigned salary{10000}; }; int main() { Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // Ok Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // Doesn't compile Employee e2{.salary{55000}}; // Warning: missing initializer for base class }</code>
지정된 이니셜라이저를 사용하여 직원의 초기화가 실패하고 이니셜라이저 누락에 대한 경고가 생성되는 이유는 무엇입니까?
답변:
C 20 표준(9.3.1에 따르면) 집계, p. #3), 지정된 이니셜라이저를 사용할 때 지정자의 각 식별자는 클래스의 직접적인 비정적 데이터 멤버의 이름을 지정해야 합니다. 이는 지정된 이니셜라이저를 사용하여 기본 클래스 멤버를 초기화할 수 없음을 의미합니다.
따라서 e1의 경우처럼 지정된 이니셜라이저를 사용하여 Employee를 초기화하는 것은 올바르지 않으며 다음과 같이 목록 초기화 또는 중첩 초기화로 대체해야 합니다. 다음은 다음과 같습니다.
<code class="cpp">Employee e1{"John", "Wick", 40, 50000}; // List initialization Employee e2{{"John", "Wick", 40}, 50000}; // Nested initialization Employee e1{{.name{"John"}, .surname{"Wick"}, .age{40}}, 50000}; // Nested initialization with designated initializer for base class</code>
마지막 예에서 기본 클래스 Person은 중첩된 초기화 내의 지정된 초기화 목록을 사용하여 초기화됩니다.
위 내용은 C 20에서 지정된 초기화 프로그램을 사용하여 파생 클래스 멤버를 초기화할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!