Rumah >pembangunan bahagian belakang >C++ >Mengapakah pembina bergerak C 11 tidak dipanggil apabila menginstant objek dengan objek lain?

Mengapakah pembina bergerak C 11 tidak dipanggil apabila menginstant objek dengan objek lain?

Linda Hamilton
Linda Hamiltonasal
2024-11-05 08:20:02725semak imbas

Why isn't the C  11 move constructor called when instantiating an object with another object?

C 11 Move Constructor Tidak Dipanggil, Default Constructor Diutamakan

Soalan:

Dalam C 11, apabila menginstant objek melalui objek lain, mengapa mungkin pembangun bergerak tidak dipanggil apabila ia sepatutnya?

Jawapan:

Setelah instantiasi, pengkompil mungkin sekali-sekala mengaplikasikan teknik yang dikenali sebagai copy elision. Penyingkiran salin membenarkan pembinaan terus objek sementara ke dalam sasaran yang akan disalin atau dipindahkan ke dalamnya, memintas salinan atau memindahkan pasangan pembina/pemusnah.

Standard membenarkan penyingkiran salinan dalam keadaan berikut:

  • Penyata Pulangan: Objek automatik tidak meruap dengan jenis cv-tidak layak yang sama seperti jenis pemulangan fungsi boleh dibina terus ke dalam nilai pulangan.
  • Ungkapan Lempar: Objek automatik tidak meruap yang skopnya tidak melangkaui blok cuba yang melampirkan paling dalam boleh dibina terus ke dalam objek pengecualian.
  • Objek Sementara: Objek sementara yang belum terikat kepada rujukan boleh dibina terus ke dalam objek dengan jenis cv-tidak layak yang sama.
  • Pengendali Pengecualian: Pengisytiharan pengecualian bagi pengendali pengecualian boleh dianggap sebagai alias untuk pengecualian objek, meninggalkan operasi salinan atau gerakkan.

Dalam contoh yang diberikan, apabila menginstant z dengan X("ujian"), penyingkiran salinan berlaku kerana ia dianggap sebagai objek sementara yang tidak terikat kepada rujukan. Akibatnya, ia dibina terus ke dalam z, memintas pembina bergerak dan membina z menggunakan pembina lalai sebaliknya.

Panggilan move(X("test") secara eksplisit menghalang penyingkiran salinan dan memaksa penggunaan pembina bergerak , seperti yang diperhatikan dalam output yang diubah suai.

Atas ialah kandungan terperinci Mengapakah pembina bergerak C 11 tidak dipanggil apabila menginstant objek dengan objek lain?. 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