컴파일러 오류 이해 "클래스 종료 전에 기본 멤버 초기화 필요"
이 코드 조각에서:
<code class="cpp">#include <cassert> #include <iostream> #include <cstdlib> class Downloader { public: struct Hints { int32_t numOfMaxEasyHandles = 8; }; static Downloader *Create(const Hints &hints = Hints()); }; Downloader* Downloader::Create(const Hints &hints) { std::cout << hints.numOfMaxEasyHandles << std::endl; return nullptr; }</code>
구조 힌트의 인스턴스를 구성하는 기본 인수를 정의하려고 시도하는 동안 Clang 및 GCC 컴파일러에서 "인클로징 클래스가 끝나기 전에 기본 멤버 초기화 프로그램이 필요합니다"라는 오류 메시지가 발생합니다.
이유 for the Error
이 오류는 Create 함수의 기본 인수가 Hints 구조체 선언 내에서 기본 멤버 초기화 프로그램을 정의해야 하는 중요한 생성자이기 때문에 발생합니다. 멤버 이니셜라이저가 없으면 컴파일러는 기본 인수가 사용될 때 numOfMaxEasyHandles 멤버의 초기 값을 결정할 수 없습니다.
해결책
문제를 해결하려면 힌트 구조체에는 다음과 같이 기본 멤버 이니셜라이저가 포함되어야 합니다.
<code class="cpp">struct Hints { int32_t numOfMaxEasyHandles = 8; Hints() {} // Default member initializer };</code>
기본 멤버 이니셜라이저가 있으면 Clang과 GCC 모두 코드를 성공적으로 컴파일할 수 있습니다. 이 솔루션이 작동하려면 Hints 구조체에서 명시적인 기본 생성자를 정의해야 합니다.
GCC 및 Clang Bug
다음 줄을 볼 수 있습니다.
<code class="cpp">Hints() = default;</code>
Clang 및 GCC 문제는 해결되지 않습니다. 이는 생성자가 기본 인수로 사용되는 경우와 같은 특정 컨텍스트에서 중요하지 않은 생성자의 기본 멤버 이니셜라이저가 올바르게 인식되지 않는 이러한 컴파일러의 알려진 버그입니다.
위 내용은 중요하지 않은 생성자를 기본 인수로 사용할 때 \'클래스 종료 전에 기본 멤버 초기화 필요\' 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!