컴파일러 오류 이해: "클래스 종료 전에 기본 멤버 초기화 필요"
gcc8.2 및 clang7.0의 경우 사용자에게 다음 오류 메시지가 나타날 수 있습니다.
default member initializer for 'Downloader::Hints::numOfMaxEasyHandles' required before the end of its enclosing class
이 오류는 Downloader 클래스의 Hints 구조체 내 numOfMaxEasyHandles 변수에 대한 기본 멤버 이니셜라이저의 미묘한 문제로 인해 발생합니다.
<code class="cpp">class Downloader { public: struct Hints { int32_t numOfMaxEasyHandles = 8; //Hints(){} // <= if I uncomment this all works gcc+clang+msvc //Hints() = default; // <= if I uncomment this neither clang no gcc works (msvc - works) }; };</code>
오류의 기본 소스:
Hints 구조체의 기본 생성자 Hints()를 주석 처리하지 않으면 오류 메시지가 사라집니다. 그러나 기본 생성자를 Hints() = default;로 바꾸면 gcc와 clang에서 오류가 지속됩니다.
이 동작은 gcc와 clang 모두에서 알려진 버그입니다. 이러한 시나리오에서 컴파일러는 기본 생성자가 존재하더라도 구조체 정의 자체 내에서 numOfMaxEasyHandles에 대한 기본 멤버 이니셜라이저를 정의해야 합니다.
MSVC의 동작:
반대로, MSVC2017에서는 이 오류가 발생하지 않으며 코드가 문제 없이 컴파일될 수 있습니다. 이는 MSVC가 기본 멤버 이니셜라이저를 gcc 및 clang과 다르게 처리하기 때문입니다.
해결 방법:
gcc 및 clang의 오류를 해결하려면 간단히 기본 멤버를 정의하면 됩니다. 구조체 정의 내의 초기화 프로그램:
<code class="cpp">struct Hints { int32_t numOfMaxEasyHandles = 8; };</code>
이 수정을 통해 코드는 세 가지 컴파일러 모두에서 성공적으로 컴파일되어야 합니다.
위 내용은 기본 생성자가 있어도 gcc 및 clang에 기본 멤버 이니셜라이저가 필요한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!