Rumah >pembangunan bahagian belakang >C++ >Mengapakah Permulaan Agregat Tidak Lagi Dibenarkan untuk Structs dengan Konstruktor Lalai atau Dipadam Secara Eksplisit dalam C 20?

Mengapakah Permulaan Agregat Tidak Lagi Dibenarkan untuk Structs dengan Konstruktor Lalai atau Dipadam Secara Eksplisit dalam C 20?

Patricia Arquette
Patricia Arquetteasal
2024-11-03 08:29:30739semak imbas

Why Is Aggregate Initialization No Longer Allowed for Structs with Explicitly Defaulted or Deleted Constructors in C  20?

Permulaan Agregat dalam C 20

Dalam C 20, pemulaan agregat untuk struct yang telah memungkiri atau memadamkan pembina secara eksplisit telah mengalami perubahan yang ketara. Perubahan ini menjejaskan kod yang sebelum ini sah tetapi kini menjana ralat.

Keserasian Pra-C 20

Sebelum C 20, permulaan agregat dibenarkan untuk struct yang memiliki pengguna- disediakan, diwarisi, atau pembina yang lalai atau dipadamkan secara eksplisit. Ini membenarkan pintasan pembina semasa pemulaan.

Piawaian C 20

Walau bagaimanapun, piawaian C 20 telah menyemak gelagat ini. Inisialisasi agregat kini dibenarkan hanya untuk struct yang kekurangan pembina yang diisytiharkan pengguna atau diwarisi. Pembina lalai atau dipadam secara eksplisit tidak lagi dibenarkan. Perubahan ini dilaksanakan untuk menangani kekaburan dan kekeliruan dalam semantik permulaan.

Rasional Perubahan

Rasional di sebalik perubahan dalam piawaian C ini berakar umbi dalam keinginan untuk meningkatkan keselamatan, keseragaman, dan kejelasan permulaan. Tingkah laku sebelumnya boleh membawa kepada kod yang tidak dijangka dan salah, seperti yang digambarkan oleh:

struct X {
  int i{4};
  X() = default;
};

int main() {
  X x1(3); // ill-formed - no matching c’tor
  X x2{3}; // compiles!
}

Dalam contoh ini, pembina lalai X tidak boleh digunakan untuk permulaan kerana pengisytiharan pembolehubah ahli i dengan permulaan nilai 4. Walau bagaimanapun, pemulaan agregat tersilap dibenarkan, membawa kepada tingkah laku samar-samar dan berkemungkinan tidak betul.

Implikasi untuk Kod

Perubahan ini memerlukan pengubahsuaian kod untuk kes di mana agregat inisialisasi sebelum ini digunakan dengan pembina lalai atau dipadamkan secara eksplisit. Ia menggesa pembangun untuk mempertimbangkan semula amalan pembina lalai secara eksplisit untuk jenis data agregat.

Kesimpulannya, perubahan standard C 20 mengenai pemulaan agregat bertujuan untuk meningkatkan kebolehpercayaan dan ketekalan simpulan bahasa permulaan, mewajarkan potensi ketidakserasian ke belakang ia memperkenalkan.

Atas ialah kandungan terperinci Mengapakah Permulaan Agregat Tidak Lagi Dibenarkan untuk Structs dengan Konstruktor Lalai atau Dipadam Secara Eksplisit dalam C 20?. 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