>백엔드 개발 >C++ >C 20에서 상속된 멤버를 초기화하기 위해 지정된 초기화를 사용할 수 없는 이유는 무엇입니까?

C 20에서 상속된 멤버를 초기화하기 위해 지정된 초기화를 사용할 수 없는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-28 17:13:02554검색

Why can't I use designated initializers to initialize inherited members 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{DEFAULT_SALARY};
};

int main()
{
    Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // Possible
    Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // Error
    Employee e2{.salary{55000}}; // Warning
}</code>

코드에 표시된 대로 Person과 Employee는 모두 집계입니다. 그러나 지정된 이니셜라이저(e1)를 사용한 Employee 집계 초기화는 컴파일에 실패합니다. 왜 그렇습니까?

답은 C 20 표준, 특히 섹션 9.3.1 Aggregates, 3.1항에 있습니다.

"초기화 프로그램 목록이 지정된 초기화 프로그램 목록인 경우 집계는 클래스 유형이어야 하며, 각 지정자의 식별자는 클래스의 직접적인 비정적 데이터 멤버의 이름을 지정해야 하며, 집계의 명시적으로 초기화된 요소는 해당 멤버이거나 해당 멤버를 포함하는 요소입니다."

즉, 지정된 초기화는 현재 클래스의 멤버를 초기화하는 데에만 사용할 수 있습니다. 상속된 멤버나 기본 클래스 멤버에는 사용할 수 없습니다. 이러한 제한으로 인해 e1의 초기화가 유효하지 않습니다.

e1을 올바르게 초기화하려면 일반적인 목록 초기화 구문을 사용할 수 있습니다.

<code class="cpp">Employee e1{ "John", "Wick", 40, 50000 }; // Works</code>

또는 지정된 및 동일한 결과를 얻기 위한 비지정 초기화:

<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 }; // Also works</code>

이 경우 직접 기본 클래스(Person)는 지정된 초기화 목록을 사용하여 초기화되고 전체 Employee 클래스는 비지정 초기화 목록을 사용하여 초기화됩니다. 초기화 목록.

전반적으로 C 20에서 클래스 계층 구조로 작업할 때 지정된 초기화의 제한 사항을 기억하는 것이 중요합니다. 적절한 초기화 구문을 사용하면 기본 클래스와 파생 클래스 모두의 데이터 멤버를 효과적이고 정확하게 초기화할 수 있습니다. .

위 내용은 C 20에서 상속된 멤버를 초기화하기 위해 지정된 초기화를 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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