> 백엔드 개발 > C++ > C 20이 사용자 선언 생성자가 있는 구조체에 대한 집계 초기화를 금지하는 이유는 무엇입니까?

C 20이 사용자 선언 생성자가 있는 구조체에 대한 집계 초기화를 금지하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-02 12:29:02
원래의
534명이 탐색했습니다.

Why Does C  20 Prohibit Aggregate Initialization for Structs with User-Declared Constructors?

집계 초기화 중단: C 20 수정의 영향

C 17에서 C 20으로 전환한 이후 집계 초기화가 크게 변경되었습니다. 명시적 생성자가 기본값으로 설정되거나 삭제될 때. 이 기사에서는 이 수정의 이유를 자세히 알아보고 그 의미를 살펴봅니다.

변경의 원인

이전에는 C 17에서 집계 초기화가 허용되었습니다. 명시적으로 기본값이 지정되거나 삭제된 생성자가 있는 구조체. 그러나 C 20이 채택되면서 기본 생성자나 삭제된 생성자를 포함하여 사용자가 선언한 생성자가 있는 구조체에 대한 집계 초기화를 허용하지 않도록 C 표준이 개정되었습니다.

정의

이 변경의 주요 동기는 집계 초기화의 잠재적인 불일치와 혼란을 해결하는 데 있습니다. 표준 위원회는 사용자가 선언한 생성자가 있는 구조체에 대해 집계 초기화를 허용하면 기본값이 설정되었거나 삭제된 생성자라도 예상치 못한 오류가 발생하는 경우가 많다는 점을 인식했습니다.

다음 예를 고려하세요.

<code class="cpp">struct Foo
{
    Foo() = default;
    int bar;
};

int main()
{
    Foo test = { 0 }; // Error: Cannot initialize due to defaulted constructor
}</code>
로그인 후 복사

이 경우 기본 생성자는 기본적으로 구조체 초기화에 아무런 영향을 미치지 않더라도 명시적으로 제공됩니다. 그러나 이 시나리오에서 집계 초기화를 허용하면 생성자를 우회하여 잠재적으로 정의되지 않은 동작이나 불일치가 발생할 수 있습니다.

개발자 관행에 미치는 영향

집계 초기화 관행의 변경으로 인해 클래스와 구조체를 구조화하고 초기화하는 데 권장되는 접근 방식을 변경했습니다. 이전에는 코드 가독성을 높이고 더 깔끔한 구문을 보장하기 위해 명시적으로 기본 생성자를 사용하는 것이 일반적이었습니다. 그러나 현재 표준에서는 초기화가 필요한 클래스나 구조체에 대해 기본 생성자를 더 이상 권장하지 않습니다.

결론

C 20에서 집계 초기화 수정 코드 명확성, 일관성 및 안전성을 향상시키기 위해 만들어졌습니다. 사용자가 선언한 생성자가 있는 구조체에 대한 집계 초기화를 허용하지 않음으로써 표준은 잠재적인 함정을 제거하고 코드베이스의 전반적인 안정성을 향상시키는 것을 목표로 합니다. 개발자는 이러한 변화에 맞춰 자신의 관행을 조정하여 더욱 강력하고 유지 관리가 용이한 C 애플리케이션을 만들어야 합니다.

위 내용은 C 20이 사용자 선언 생성자가 있는 구조체에 대한 집계 초기화를 금지하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿