>백엔드 개발 >C++ >중요하지 않은 생성자를 기본 인수로 사용할 때 \'클래스 종료 전에 기본 멤버 초기화 필요\' 오류가 발생하는 이유는 무엇입니까?

중요하지 않은 생성자를 기본 인수로 사용할 때 \'클래스 종료 전에 기본 멤버 초기화 필요\' 오류가 발생하는 이유는 무엇입니까?

DDD
DDD원래의
2024-10-29 08:04:02800검색

Why Does

컴파일러 오류 이해 "클래스 종료 전에 기본 멤버 초기화 필요"

이 코드 조각에서:

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.