Di C ++ 11, kita bisa menulis kode ini:
struct Cat {
Cat(){}
};
const Cat cat;
std::move(cat); //this is valid in C++11
ketika saya panggil std::move, artinya saya ingin memindahkan objek, yaitu saya akan mengubah objek. Untuk memindahkan constobjek tidak masuk akal, jadi mengapa std::movetidak membatasi perilaku ini? Itu akan menjadi jebakan di masa depan, bukan?
Di sini jebakan berarti seperti yang disebutkan Brandon dalam komentar:
"Saya pikir dia bersungguh-sungguh" menjebak "dia dengan licik karena jika dia tidak menyadarinya, dia berakhir dengan salinan yang bukan itu yang dia inginkan."
Dalam buku 'Effective Modern C ++' karya Scott Meyers, ia memberi contoh:
class Annotation {
public:
explicit Annotation(const std::string text)
: value(std::move(text)) //here we want to call string(string&&),
//but because text is const,
//the return type of std::move(text) is const std::string&&
//so we actually called string(const string&)
//it is a bug which is very hard to find out
private:
std::string value;
};
Jika std::movedilarang beroperasi pada suatu constobjek, kita bisa dengan mudah mengetahui bugnya, bukan?
CAT cat2 = std::move(cat);, dengan asumsi CATmendukung tugas-pindah biasa.
std::movehanya gips, tidak benar-benar menggerakkan apa pun
std::movedengan sendirinya tidak melakukan apa pun pada objek. Orang bisa membantah bahwastd::movenama itu buruk.