Tugasan kepada Rvalue: Mengapa dan Bagaimana?
Mengapakah mungkin untuk menetapkan kepada nilai pulangan (rvalue) jenis kelas? Secara konvensional, nilai r dianggap tidak kekal, tidak mempunyai alamat ingatan. Jadi, bagaimanakah ia boleh digunakan sebagai nilai sebelah kiri (lvalues)?
Pertimbangkan kod membingungkan berikut:
class Y { public : explicit Y(size_t num = 0) {} }; int main() { Y(1) = Y(0); // WHAT?!? return 0; }
Kod ini disusun tanpa ralat, walaupun ia mungkin kelihatan tidak logik. Untuk memahami sebabnya, kita perlu menyelidiki mekanik di sebalik pengendali tugasan.
Operator Tugasan Disintesis
Apabila kelas tidak mentakrifkan operator tugasan secara eksplisit, pengkompil secara automatik menjana satu. Operator yang disintesis boleh mengambil salah satu daripada dua bentuk:
The bentuk terakhir adalah ketara kerana ia terpakai kepada rnilai. Oleh itu, dalam contoh di atas, pengkompil menjana pengendali tugasan yang boleh menerima nilai r yang dikembalikan oleh pembina Y(1).
Mencegah Penetapan kepada Rvalue
Jika anda ingin melarang penugasan kepada nilai, anda boleh mengisytiharkan pengendali tugasan secara eksplisit dengan ref-qualifiers. Dengan cara ini, anda boleh menyekat pengendali untuk hanya menerima nilai. Contohnya:
class Y { public : explicit Y(std::size_t num = 0); Y& operator=(Y const&) & = default; };
Dengan menggunakan ref-qualifier &, anda memastikan bahawa operator tugasan yang disintesis hanya tersedia untuk lvalues.
Atas ialah kandungan terperinci Tugasan kepada Rvalues: Dilarang atau Ciri? Mengapa Kita Boleh Berikan Nilai Pulangan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!