Mengapa Pembolehubah Rujukan Rvalue Bukan Rvalue?
Mari kita pertimbangkan dua fungsi terlebih beban f:
void f(T&&); // Overload #1 void f(T&); // Overload #2
Dalam fungsi g:
void g(T&& t) { f(t); // Calls Overload #2 }
Anehnya, Terlalu Beban #2 dipanggil kerana t dianggap sebagai lnilai, walaupun lebihan pertama mempunyai tandatangan rujukan rnilai (T&&).
Bagaimanakah tandatangan rujukan rnilai gagal sepadan dengan panggilan yang melepasi nilai r?
Memahami Peraturan C untuk Rvalues
Rvalues secara amnya pembolehubah tanpa nama yang akan kehilangan nama mereka sebentar lagi. T&& t mempunyai pengecam t, jadi ia adalah nilai. Ini masuk akal kerana nilai rseharusnya berumur pendek dan mustahil untuk dirujuk kemudian.
Walau bagaimanapun, T&& ialah rujukan nilai jenis. Ia hanya boleh mengikat nilai r tanpa melibatkan hantaran statik, tetapi ia masih merupakan nilai rujukan rnilai jenis. Sifat rujukan nilainya hanya penting semasa penggunaan permulaan dan decltypenya. Jika tidak, ia bertindak sebagai nilai jenis rujukan.
Pelanjutan Cast dan Rujukan Statik
std::move(t) mengembalikan rujukan nilai dengan melakukan cast statik pada t. Ini membolehkan nilai sementara mempunyai sambungan sepanjang hayat rujukan apabila ia terikat pada rujukan di luar pembina.
Piawaian C mentakrifkan peraturan eksplisit untuk mengendalikan senario ini. Rujukan rnilai dan rujukan const boleh mengikat rnilai. Pergerakan tersirat berlaku apabila mengembalikan nilai yang dinamakan daripada fungsi, apabila nilai tidak mempunyai nama atau apabila fungsi secara eksplisit mengembalikan rujukan nilai.
Selain itu, T&& mungkin tidak selalu menjadi rujukan nilai. Jika T ialah X& atau X const&, rujukan runtuh menukarkan T&& kepada X& atau X const&. Akhir sekali, T&&& boleh bertindak sebagai "rujukan pemajuan" dalam potongan jenis, bergantung pada jenis hujah.
Atas ialah kandungan terperinci Mengapa Pembolehubah Rujukan Rvalue Tidak Padan dengan Tandatangan Fungsi Rujukan Rvalue?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!