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