Dalam C 11, adalah dibenarkan untuk memanggil std::move pada objek const, tindakan yang mungkin kelihatan tidak logik memandangkan kebolehubahan objek tersebut. Tingkah laku ini telah menimbulkan kebimbangan mengenai potensinya untuk membawa kepada ralat pengaturcaraan yang halus.
Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa std::move(const) tidak mengubah suai objek sebenar. Sebaliknya, ia hanya mengarahkan pengkompil untuk mencuba operasi bergerak. Jika objek tidak menyokong semantik move (cth., tidak mempunyai pembina yang serasi), pengkompil akan secara automatik menggunakan pembina salinan.
Tingkah laku ini membolehkan pembangun menggunakan std::move dengan selamat untuk objek yang mungkin atau mungkin tidak menyokong semantik bergerak. Jika operasi pemindahan boleh dilaksanakan, pengkompil akan memindahkan pemilikan dengan cekap, dengan itu mengoptimumkan prestasi. Walau bagaimanapun, jika langkah tidak disokong, kod masih akan berfungsi dengan betul, walaupun dengan penalti prestasi yang dikaitkan dengan penyalinan.
Dalam contoh yang disediakan:
struct Cat { Cat(){} }; const Cat cat; std::move(cat); //this is valid in C++11
std::move( cat) akan menggunakan pembina salinan dengan berkesan kerana Cat tidak mentakrifkan pembina bergerak. Oleh itu, sifat const objek dikekalkan dan tiada ralat atau tingkah laku yang tidak dijangka akan berlaku.
Dalam kes kelas Anotasi dalam contoh Scott Meyers:
class Annotation { public: explicit Annotation(const std::string text) : value(std::move(text)) };
Pengkompil akan cuba menggunakan pembina std::string(std::string&&), tetapi memandangkan teks ialah const, jenis sebenar std::move(text) ialah const std::string&&, yang tidak sepadan dengan std yang diperlukan: :rentetan&&. Akibatnya, pembina std::string(const std::string&) akan dipanggil, membawa kepada penalti prestasi tetapi bukan ralat.
Oleh itu, walaupun ia mungkin kelihatan berlawanan dengan intuitif untuk menggunakan std:: bergerak pada objek const, ia tidak semestinya membawa kepada ralat atau ketidakstabilan. Sebaliknya, ia mendayakan kod yang fleksibel dan cekap dengan membenarkan pengkompil menentukan tindakan yang sesuai berdasarkan ketersediaan semantik bergerak untuk objek tertentu.
Atas ialah kandungan terperinci Mengapakah `std::move` dibenarkan pada objek const dalam C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!