Bagaimanakah std::move Mengubah Ungkapan kepada Rvalues?
std::move() memudahkan penukaran ungkapan kepada rvalues (kanan rujukan nilai) untuk membolehkan semantik bergerak. Walau bagaimanapun, pelaksanaan dalam perpustakaan standard MSVC boleh membingungkan.
Pelaksanaan adalah seperti berikut:
1 2 3 4 5 6 |
|
Mari kita tunjukkan cara ini berfungsi:
1 2 |
|
Setelah memanggil std::move(), parameter rujukan _Arg mengikat kepada lvalue obj1. Walau bagaimanapun, memandangkan pengikatan rujukan rvalue kepada lvalue tidak dibenarkan secara langsung, seseorang mungkin menjangkakan hantaran ke rujukan rvalue, seperti (Objek&&), diperlukan.
Mempelajari lebih lanjut tentang pelaksanaan std:: remove_reference menjelaskan perkara:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Pelaksanaan ini mendedahkan bahawa remove_reference menukar T& kepada T, T&& kepada T, dan T&&& ke dalam T. Oleh itu, untuk kes kami, di mana obj1 ialah lnilai jenis Objek, fungsi yang terhasil menjadi:
1 2 3 4 |
|
Untuk menghuraikan lebih lanjut:
1 2 3 4 |
|
Pelakon ke Object&& adalah perlu kerana rujukan rnilai yang dinamakan dianggap sebagai lnilai, manakala penukaran tersirat daripada rujukan lnilai kepada rnilai tidak dibenarkan.
1 2 3 4 |
|
Di sini, peraturan runtuh rujukan C 11 mula dimainkan dan membenarkan ungkapan Object& && ditafsirkan sebagai Object&, rujukan nilai, yang sememangnya boleh mengikat kepada nilai. Oleh itu, fungsi akhir mengubah hujahnya menjadi rujukan rvalue dan mengembalikannya.
Sebagai kesimpulan, std::move() menggunakan std::remove_reference untuk membolehkan perubahan nilai l dan rvalues kepada rvalues, memudahkan pergerakan semantik dalam C .
Atas ialah kandungan terperinci Bagaimanakah `std::move()` mencapai penukaran lvalues kepada rvalues dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!