Rumah > pembangunan bahagian belakang > C++ > Mengapa Pembolehubah Rujukan Rvalue Tidak Padan dengan Tandatangan Fungsi Rujukan Rvalue?

Mengapa Pembolehubah Rujukan Rvalue Tidak Padan dengan Tandatangan Fungsi Rujukan Rvalue?

Mary-Kate Olsen
Lepaskan: 2024-12-10 22:46:11
asal
810 orang telah melayarinya

Why Doesn't an Rvalue Reference Variable Match an Rvalue Reference Function Signature?

Mengapa Pembolehubah Rujukan Rvalue Bukan Rvalue?

Mari kita pertimbangkan dua fungsi terlebih beban f:

void f(T&&); // Overload #1
void f(T&);  // Overload #2
Salin selepas log masuk

Dalam fungsi g:

void g(T&& t) { 
  f(t);  // Calls Overload #2
}
Salin selepas log masuk

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!

sumber:php.cn
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