> 백엔드 개발 > C++ > C 20에서 명시적으로 기본값이 지정되거나 삭제된 생성자를 사용하여 집계 초기화가 실패하는 이유는 무엇입니까?

C 20에서 명시적으로 기본값이 지정되거나 삭제된 생성자를 사용하여 집계 초기화가 실패하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-02 18:24:30
원래의
237명이 탐색했습니다.

Why Does Aggregate Initialization Fail with Explicitly Defaulted or Deleted Constructors in C  20?

C 20에서 명시적으로 기본값이 설정되거나 삭제된 생성자를 사용하면 집계 초기화가 실패하는 이유

C 20에서 명시적으로 기본값이 설정되거나 삭제된 구조체의 집계 초기화 생성자는 더 이상 지원되지 않습니다. 이 변경은 C 표준 개정의 결과입니다. C 20 이전에는 생성자가 없거나 명시적으로 기본값을 지정하거나 삭제된 생성자만 있는 구조체에 대해 집계 초기화가 허용되었습니다. 그러나 C 20에서는 집계 초기화가 사용자 선언 또는 상속된 생성자가 없는 구조체에만 허용된다는 내용으로 표준이 업데이트되었습니다.

Reasoning Behind the Change

이 변경 사항은 예상치 못한 혼란스러운 초기화 동작 문제를 해결하기 위해 도입되었습니다. 이전 버전의 C에서는 의도하지 않은 경우에도 명시적으로 기본값이 지정되거나 삭제된 생성자를 사용하여 집계 초기화를 허용할 수 있었습니다. 이로 인해 예기치 않은 변환 및 오류가 발생할 수 있습니다. 이러한 경우 집계 초기화를 제거함으로써 표준은 초기화가 항상 생성자를 통해 발생하도록 보장하여 일관되고 예측 가능한 동작을 발생시킵니다.

C 이전 20의 경우 다음 코드는 오류 없이 컴파일되었을 것입니다.

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

auto test = Foo { 0 }; // Aggregate initialization</code>
로그인 후 복사

그러나 C 20에서는 생성자가 명시적으로 기본값으로 설정되고 집계 초기화가 더 이상 허용되지 않으므로 동일한 코드가 컴파일러 오류를 발생시킵니다. 문제를 해결하려면 명시적으로 기본 설정된 생성자를 제거하거나 생성자를 사용하여 명시적으로 초기화를 수행할 수 있습니다.

<code class="cpp">auto test = Foo(0); // Constructor initialization</code>
로그인 후 복사

코딩 관행에 미치는 영향

명시적으로 이전에는 생성자를 기본값으로 설정하거나 삭제하는 것이 좋은 관행으로 여겨졌지만 C 20 표준의 변경 사항에 따르면 더 이상 유익하지 않습니다. C 20 이상 버전에서는 암시적 기본 생성자 동작에 의존하고 특별한 이유가 없는 한 생성자를 명시적으로 기본값으로 설정하거나 삭제하지 않는 것이 좋습니다.

위 내용은 C 20에서 명시적으로 기본값이 지정되거나 삭제된 생성자를 사용하여 집계 초기화가 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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