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

Barbara Streisand
Lepaskan: 2024-10-28 06:46:02
asal
233 orang telah melayarinya

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
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!