Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Tugasan kepada Rvalues: Dilarang atau Ciri? Mengapa Kita Boleh Berikan Nilai Pulangan?

Tugasan kepada Rvalues: Dilarang atau Ciri? Mengapa Kita Boleh Berikan Nilai Pulangan?

Patricia Arquette
Patricia Arquetteasal
2024-10-31 09:19:30388semak imbas

 Assignment to Rvalues: Forbidden or Feature? Why Can We Assign to a Return Value?

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:

  • Y& operator=(Y const&)
  • Y& operator=(Y&)()

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!

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