Rumah > pembangunan bahagian belakang > C++ > Mengapakah `std::move` dibenarkan pada objek const dalam C 11?

Mengapakah `std::move` dibenarkan pada objek const dalam C 11?

Patricia Arquette
Lepaskan: 2024-11-15 00:54:02
asal
757 orang telah melayarinya

Why is `std::move` allowed on const objects in C  11?

Memahami std::move on const Objects

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
Salin selepas log masuk

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))
};
Salin selepas log masuk

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!

Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan