Mengembalikan Objek Dinamakan mengikut Nilai daripada Fungsi dan Peraturan Pergerakan Tersirat
Pertimbangkan situasi di mana objek kelas generik dikembalikan oleh nilai daripada fungsi. Dalam Contoh 1:
<code class="cpp">class test { public: test() { printf(" test()\n"); } test(test&& s) { printf(" test(test&& s)\n"); } test& operator=(test e) { printf(" test& operator=( test e)\n"); return *this; } }; test Some_thing() { test i; return i; }</code>
Outputnya ialah:
test() test(test&& s)
Dalam contoh ini, ujian pembina() dipanggil untuk objek LValue yang saya buat dalam fungsi, dan pergerakan ujian pembina(test&& s) dipanggil apabila objek i dikembalikan mengikut nilai, kerana ungkapan return i ialah rujukan nilai.
Dalam Contoh 2, ujian pembina salinan(ujian& z) disediakan, tetapi pembina bergerak tidak disintesis oleh pengkompil:
<code class="cpp">class test { public: test() { printf(" test()\n"); } test(test& z) { printf(" test(test& z)\n"); } test& operator=(test e) { printf(" test& operator=( test e)\n"); return *this; } }; test Some_thing() { test i; return i; }</code>
Output kekal sama seperti dalam Contoh 1:
test() test(test& z)
Pembina salinan digunakan kerana tiada pembina bergerak tersedia.
Dalam Contoh 3, pembina bergerak dipadamkan secara eksplisit:
<code class="cpp">class test { public: test(test&& z) = delete; // Deleted move constructor test() { printf(" test()\n"); } test(test& z) { printf(" test(test& z)\n"); } test& operator=(test e) { printf(" test& operator=( test e)\n"); return *this; } }; test Some_thing() { test i; return i; }</code>
Cuba untuk menyusun kod ini akan mengakibatkan ralat, kerana pembina pergerakan yang dipadam bermakna tiada operasi pemindahan boleh dilakukan.
Dalam Contoh 4, walaupun pembina bergerak dipadamkan, kod menyusun dan runs:
<code class="cpp">class test { public: test(test&& z) = delete; test() { printf(" test()\n"); } test(test& z) { printf(" test(test& z)\n"); } test& operator=(test e) { printf(" test& operator=( test e)\n"); return *this; } }; int main() { test u; test r(u); // Copy constructor is used return 0; }</code>
Output:
test() test(test& z)
Dalam contoh ini, r(u) mencipta objek baru r dengan menyalin objek u. Pembina langkah tidak digunakan kerana ia dipadamkan, dan pembina salin digunakan sebaliknya.
Pendapat utama ialah sama ada pembina langkah digunakan atau tidak bergantung pada ketersediaan pembina langkah yang berdaya maju dan peraturan untuk resolusi beban berlebihan. Jika pembangun bergerak tersedia dan berdaya maju, ia boleh digunakan untuk memulakan nilai yang dikembalikan daripada fungsi, walaupun ungkapan yang digunakan untuk mengembalikan nilai ialah LValue.
Atas ialah kandungan terperinci Bilakah Move Constructor Digunakan untuk Mengembalikan Objek Dinamakan mengikut Nilai dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!