>  기사  >  백엔드 개발  >  기본 생성자가 있어도 gcc 및 clang에 기본 멤버 이니셜라이저가 필요한 이유는 무엇입니까?

기본 생성자가 있어도 gcc 및 clang에 기본 멤버 이니셜라이저가 필요한 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-28 06:46:02236검색

Why Does gcc and clang Require a Default Member Initializer Even with a Default Constructor?

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

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

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