Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah Peraturan Pergerakan Tersirat Memilih Pembina Salin Daripada Pembina Alih Apabila Pembina Alih Tidak Tersedia?

Mengapakah Peraturan Pergerakan Tersirat Memilih Pembina Salin Daripada Pembina Alih Apabila Pembina Alih Tidak Tersedia?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-05 10:36:02912semak imbas

Why Does the Implicit Move Rule Prefer a Copy Constructor Over a Move Constructor When the Move Constructor is Unavailable?

Mengembalikan Objek Kelas mengikut Nilai dengan Peraturan Pergerakan Tersirat

Apabila mengembalikan objek kelas mengikut nilai daripada fungsi, pergerakan tersirat peraturan berlaku. Peraturan ini menentukan pembina yang hendak digunakan untuk memulakan objek yang dikembalikan. Lazimnya, pembina bergerak lebih disukai jika objek dianggap sebagai xvalue (ungkapan yang boleh dialihkan daripada).

Dalam Contoh 1 anda, pembolehubah yang saya isytiharkan dalam Some_thing() fungsi ialah nilai x kerana ia diisytiharkan dalam skop tempatan dan dianggap layak untuk dialihkan. Oleh itu, ujian pembina bergerak(ujian&& s) digunakan, seperti yang ditunjukkan dalam output.

Walau bagaimanapun, dalam Contoh 2, anda mengalih keluar pembina bergerak dan mengubah suai pembina salinan untuk diuji (ujian& z). Perubahan ini menyebabkan output menunjukkan panggilan ke ujian pembina salinan(ujian& z) dan bukannya pembina bergerak, yang dijangkakan disebabkan oleh peraturan langkah tersirat.

Tingkah laku yang kelihatan bercanggah ini berlaku kerana i masih dianggap xvalue, tetapi pengkompil kini juga mempertimbangkan pembina salinan "biasa" sebagai berdaya maju. Peraturan pergerakan tersirat mula-mula cuba menggunakan pembina bergerak, tetapi kerana tiada satu, ia terus menggunakan pembina salinan.

Untuk menguatkuasakan penggunaan pembina bergerak secara eksplisit, anda boleh memadamkan pembina salinan. , seperti yang ditunjukkan dalam Contoh 3. Ini menghalang pengkompil daripada mempertimbangkan pembina salinan sebagai pilihan, dan pembina bergerak akan digunakan walaupun ia ditandakan sebagai const (yang biasanya menghalang pergerakan).

Contoh 4 menunjukkan bahawa objek const masih boleh dialihkan jika pembangun bergerak tersedia dan operasi bergerak adalah noexcept. Dalam kes ini, objek sementara yang dicipta semasa permulaan u dialihkan ke r, menghasilkan panggilan kepada pembina bergerak.

Atas ialah kandungan terperinci Mengapakah Peraturan Pergerakan Tersirat Memilih Pembina Salin Daripada Pembina Alih Apabila Pembina Alih Tidak Tersedia?. 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