Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah `std::move()` mencapai penukaran lvalues ​​kepada rvalues ​​dalam C ?

Bagaimanakah `std::move()` mencapai penukaran lvalues ​​kepada rvalues ​​dalam C ?

Linda Hamilton
Lepaskan: 2024-11-21 08:14:09
asal
517 orang telah melayarinya

How does `std::move()` achieve the conversion of lvalues to rvalues in C  ?

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:

template<class _Ty> inline
typename tr1::_Remove_reference<_Ty>::_Type&amp;&amp;
move(_Ty&amp;&amp; _Arg)
{ // forward _Arg as movable
    return ((typename tr1::_Remove_reference<_Ty>::_Type&amp;&amp;)_Arg);
}
Salin selepas log masuk

Mari kita tunjukkan cara ini berfungsi:

Object obj1;
Object obj2 = std::move(obj1); // _Ty&amp;&amp; _Arg binds to obj1
Salin selepas log masuk

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:

template<class _Ty>
struct _Remove_reference
{ // remove reference
    typedef _Ty _Type;
};

template<class _Ty>
struct _Remove_reference<_Ty&amp;>
{ // remove reference
    typedef _Ty _Type;
};

template<class _Ty>
struct _Remove_reference<_Ty&amp;&amp;>
{ // remove rvalue reference
    typedef _Ty _Type;
};
Salin selepas log masuk

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:

Object&amp;&amp; move(Object&amp; arg)
{
    return static_cast<Object&amp;&amp;>(arg);
}
Salin selepas log masuk

Untuk menghuraikan lebih lanjut:

  • Apabila pergerakan adalah dipanggil dengan rvalue (cth., std::move(Object())), T menjadi Object dan fungsi yang terhasil ialah:
Object&amp;&amp; move(Object&amp;&amp; arg)
{
    return static_cast<Object&amp;&amp;>(arg);
}
Salin selepas log masuk

Pelakon ke Object&& adalah perlu kerana rujukan rnilai yang dinamakan dianggap sebagai lnilai, manakala penukaran tersirat daripada rujukan lnilai kepada rnilai tidak dibenarkan.

  • Apabila move digunakan dengan lvalue, seperti dalam contoh terdahulu kami, T menjadi Object&, dan fungsi yang terhasil ialah:
Object&amp;&amp; move(Object&amp; &amp;&amp; arg)
{
    return static_cast<Object&amp;&amp;>(arg);
}
Salin selepas log masuk

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!

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