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