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
558 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:

1

2

3

4

5

6

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:

1

2

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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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:

1

2

3

4

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:

1

2

3

4

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:

1

2

3

4

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!

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