>백엔드 개발 >C++ >C 20에서 지정된 초기화 프로그램을 사용하여 파생 클래스 멤버를 초기화할 수 없는 이유는 무엇입니까?

C 20에서 지정된 초기화 프로그램을 사용하여 파생 클래스 멤버를 초기화할 수 없는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-29 14:44:02447검색

Why Can't I Initialize Derived Class Members Using Designated Initializers in C  20?

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

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