Rumah >pembangunan bahagian belakang >C++ >Bagaimana Anda Harus Menggunakan Semula Bekas C Beralih?
Apabila bekas dialihkan, ia diletakkan dalam "keadaan sah tetapi tidak ditentukan" mengikut draf standard C 0x . Dalam keadaan sedemikian, adalah penting untuk memahami cara menggunakan semula bekas yang dialihkan dengan betul.
Pertimbangkan coretan kod berikut:
std::vector<int> container; container.push_back(1); auto container2 = std::move(container); // ver1: Do nothing //container2.clear(); // ver2: "Reset" container = std::vector<int>() // ver3: Reinitialize container.push_back(2); assert(container.size() == 1 && container.front() == 2);
Menurut standard, pilihan ver3, yang melibatkan pemulaan semula bekas yang dipindahkan, adalah pendekatan yang betul. Ini kerana, selepas operasi bergerak, objek diletakkan dalam keadaan tidak ditentukan.
Standard mentakrifkan "keadaan sah tetapi tidak ditentukan" seperti berikut:
"keadaan objek yang tidak ditentukan kecuali invarian objek dipenuhi dan operasi pada objek berkelakuan seperti yang ditentukan untuk jenisnya"
Ini bermakna bahawa dialih-dari objek kekal hidup dan boleh dikendalikan, tetapi hanya jika prasyarat dipenuhi. Dalam kes vektor, mengosongkan bekas dengan clear() tidak mempunyai prasyarat dan mengembalikannya kepada keadaan yang diketahui.
Oleh itu, pengesyoran adalah menggunakan clear() untuk menetapkan semula bekas yang dialihkan dan kembalikannya kepada keadaan yang boleh digunakan.
Pilihan ver2, yang melibatkan panggilan clear() pada bekas yang dialihkan, juga sah. Walau bagaimanapun, ini mungkin membawa kepada pengoptimuman dengan menganggap bekas yang dialihkan itu kosong. Menggunakan clear() memastikan bahawa bekas dikembalikan ke keadaan yang diketahui, tanpa mengira pengoptimuman.
Pilihan ver1, yang tidak melakukan apa-apa, tidak disyorkan. Ini kerana bekas berada dalam keadaan tidak ditentukan selepas dialihkan dan mungkin menunjukkan tingkah laku yang tidak dijangka.
Atas ialah kandungan terperinci Bagaimana Anda Harus Menggunakan Semula Bekas C Beralih?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!