Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa gcc dan clang Memerlukan Pemula Ahli Lalai Walaupun dengan Pembina Lalai?

Mengapa gcc dan clang Memerlukan Pemula Ahli Lalai Walaupun dengan Pembina Lalai?

Barbara Streisand
Barbara Streisandasal
2024-10-28 06:46:02236semak imbas

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

Memahami Ralat Pengkompil: "Pemula Ahli Lalai Diperlukan Sebelum Tamat Kelas"

Apabila cuba menyusun kod di bawah dengan gcc8.2 dan clang7.0, pengguna mungkin menghadapi mesej ralat berikut:

default member initializer for 'Downloader::Hints::numOfMaxEasyHandles' required before the end of its enclosing class

Ralat ini berlaku disebabkan isu halus dengan pemula ahli lalai untuk pembolehubah numOfMaxEasyHandles dalam struct Petunjuk kelas Downloader.

<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>

Sumber asas ralat:

Jika pembina lalai Hints() untuk struct Hints tidak dikomen, mesej ralat hilang. Walau bagaimanapun, jika pembina lalai digantikan dengan Hints() = default;, ralat berterusan dalam gcc dan clang.

Tingkah laku ini ialah pepijat yang diketahui dalam kedua-dua gcc dan clang. Dalam senario sedemikian, pengkompil memerlukan pemula ahli lalai untuk numOfMaxEasyHandles ditakrifkan dalam definisi struct itu sendiri, walaupun pembina lalai hadir.

Gelagat MSVC:

Sebaliknya, MSVC2017 tidak mempamerkan ralat ini dan membenarkan kod untuk disusun tanpa sebarang masalah. Ini kerana MSVC mengendalikan pemula ahli lalai secara berbeza daripada gcc dan clang.

Penyelesaian:

Untuk menyelesaikan ralat dalam gcc dan clang, seseorang hanya boleh mentakrifkan ahli lalai pemula dalam takrifan struct:

<code class="cpp">struct Hints
{       
    int32_t numOfMaxEasyHandles = 8;
};</code>

Dengan pengubahsuaian ini, kod harus berjaya disusun dalam ketiga-tiga penyusun.

Atas ialah kandungan terperinci Mengapa gcc dan clang Memerlukan Pemula Ahli Lalai Walaupun dengan Pembina Lalai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn