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