Rumah > pembangunan bahagian belakang > C++ > Mengapakah Permulaan Agregat Gagal dengan Pembina yang Dilalai atau Dipadamkan secara Jelas dalam C 20?

Mengapakah Permulaan Agregat Gagal dengan Pembina yang Dilalai atau Dipadamkan secara Jelas dalam C 20?

DDD
Lepaskan: 2024-11-02 18:24:30
asal
237 orang telah melayarinya

Why Does Aggregate Initialization Fail with Explicitly Defaulted or Deleted Constructors in C  20?

Mengapa Permulaan Agregat Gagal dengan Pembina Diingkari atau Dipadamkan secara Eksplisit dalam C 20

Dalam C 20, permulaan agregat bagi struct dengan lalai atau dipadamkan secara eksplisit pembina tidak lagi disokong. Perubahan ini adalah hasil daripada semakan dalam piawaian C. Sebelum C 20, pemulaan agregat dibenarkan untuk struct yang sama ada tidak mempunyai pembina atau hanya mempunyai pembina lalai atau dipadamkan secara eksplisit. Walau bagaimanapun, dalam C 20, standard telah dikemas kini untuk menyatakan bahawa permulaan agregat hanya dibenarkan untuk struct tanpa pembina yang diisytiharkan pengguna atau diwarisi.

Reasoning Behind the Change

Perubahan itu diperkenalkan untuk menangani masalah tingkah laku permulaan yang tidak dijangka dan mengelirukan. Dalam versi terdahulu C , pembina yang lalai atau dipadam secara eksplisit boleh membenarkan pemulaan agregat, walaupun ia tidak dimaksudkan. Ini boleh membawa kepada penukaran dan ralat yang tidak dijangka. Dengan menghapuskan permulaan agregat dalam kes ini, piawaian memastikan bahawa permulaan sentiasa berlaku melalui pembina, menghasilkan tingkah laku yang konsisten dan boleh diramal.

Contoh

Sebelum C 20, kod berikut akan disusun tanpa ralat:

<code class="cpp">struct Foo
{
    Foo() = default;
    int bar;
};

auto test = Foo { 0 }; // Aggregate initialization</code>
Salin selepas log masuk

Walau bagaimanapun, dalam C 20, kod yang sama menimbulkan ralat pengkompil, kerana pembina diingkari secara eksplisit dan permulaan agregat tidak lagi dibenarkan. Untuk membetulkan isu tersebut, pembina lalai secara eksplisit boleh dialih keluar atau pemula boleh dilakukan secara eksplisit menggunakan pembina:

<code class="cpp">auto test = Foo(0); // Constructor initialization</code>
Salin selepas log masuk

Impak ke atas Amalan Pengekodan

Sementara secara eksplisit mengingkari atau memadam pembina sebelum ini dilihat sebagai amalan yang baik, perubahan dalam piawaian C 20 menunjukkan bahawa ia tidak lagi berfaedah. Dalam versi C 20 dan yang lebih baru, adalah disyorkan untuk bergantung pada gelagat pembina lalai tersirat dan elakkan secara eksplisit lalai atau memadamkan pembina melainkan terdapat sebab khusus untuk berbuat demikian.

Atas ialah kandungan terperinci Mengapakah Permulaan Agregat Gagal dengan Pembina yang Dilalai atau Dipadamkan secara Jelas dalam C 20?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan