Rumah > pembangunan bahagian belakang > C++ > Mengapakah Pembinaan Lalai atau Pemadaman Secara Eksplisit Menghalang Permulaan Agregat dalam C 20?

Mengapakah Pembinaan Lalai atau Pemadaman Secara Eksplisit Menghalang Permulaan Agregat dalam C 20?

Patricia Arquette
Lepaskan: 2024-11-02 16:28:03
asal
283 orang telah melayarinya

Why Does Explicitly Defaulting or Deleting Constructors Prevent Aggregate Initialization in C  20?

Mengapa pembina lalai atau dipadamkan eksplisit menghalang pemulaan agregat dalam C 20

C 20 memperkenalkan perubahan yang mempengaruhi pemulaan agregat. Sebelum ini, struct yang dibenarkan mungkin telah memungkiri atau memadamkan pembina secara eksplisit. Walau bagaimanapun, ini tidak lagi berlaku.

Penaakulan

Perubahan ini didorong oleh keinginan untuk meningkatkan semantik permulaan dalam C dan menjadikannya lebih konsisten. Membenarkan permulaan agregat dengan pembina lalai atau dipadamkan secara eksplisit boleh membawa kepada tingkah laku yang mengelirukan dan tidak dijangka.

Sebagai contoh, pertimbangkan kod berikut:

<code class="cpp">struct X {
  int i{4};
  X() = default;
};

int main() {
  X x1(3); // ill-formed - no matching c’tor
  X x2{3}; // compiles!
}</code>
Salin selepas log masuk

Dalam C 17, x2 akan memulakan ahli i berubah kepada 3. Walau bagaimanapun, tingkah laku ini tidak konsisten dengan pembina yang ditentukan pengguna. Perubahan ini menyelesaikan ketidakkonsistenan ini.

Penyelesaian Alternatif

Untuk menyelesaikan ralat, pembina lalai atau dipadamkan secara eksplisit tidak boleh digunakan untuk jenis agregat. Sebaliknya, pertimbangkan untuk meninggalkan pembina atau menggunakan pembina yang ditentukan pengguna.

Atas ialah kandungan terperinci Mengapakah Pembinaan Lalai atau Pemadaman Secara Eksplisit Menghalang Permulaan Agregat dalam C 20?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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