Rumah >pembangunan bahagian belakang >C++ >Adakah Kita Memerlukan Operator Tugasan C Move `jika (ini != &rhs)` Daftar masuk?

Adakah Kita Memerlukan Operator Tugasan C Move `jika (ini != &rhs)` Daftar masuk?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-05 22:16:11606semak imbas

Do We Need the `if (this != &rhs)` Check in C   Move Assignment Operators?

Pindahkan Operator Tugasan dan jika (ini != &rhs)

Dalam pengendali tugasan salinan kelas, ia adalah amalan biasa untuk menyemak sama ada objek yang diberikan ialah objek yang memanggil untuk menghalang penugasan diri:

Class& Class::operator=(const Class& rhs) {
    if (this != &rhs) {
        // Do the assignment
    }

    return *this;
}

Semakan ini ialah penting untuk mengelakkan objek daripada ditugaskan kepada dirinya sendiri, yang boleh membawa kepada tingkah laku atau ralat yang tidak dijangka. Walau bagaimanapun, dalam kes pengendali penugasan pindah, keperluan cek ini boleh dipertikaikan.

Adakah kita memerlukan cek yang sama untuk pengendali tugasan pindah?

Class& Class::operator=(Class&& rhs) {
    if (this != &rhs) {
        // Do the assignment
    }

    return *this;
}

Timbul persoalan sama ada terdapat situasi di mana == &rhs ini benar untuk operator penugasan pindah. Jawapannya bergantung pada tafsiran pengendali tugasan pindah.

Tafsiran pengendali tugasan pindah:

Terdapat dua tafsiran utama pengendali tugasan pindah:

  1. Mengekalkan nilai semasa: Ada yang berpendapat bahawa tugasan bergerak sendiri (di mana ini == &rhs) harus mengekalkan nilai semasa objek. Dalam kes ini, semakan if (this != &rhs) adalah perlu untuk mengelakkan penugasan diri secara tidak sengaja.
  2. Ditetapkan kepada keadaan yang sah: Yang lain berpendapat bahawa pengendali tugasan bergerak sendiri tidak semestinya mengekalkan nilai semasa tetapi harus meninggalkan objek dalam keadaan yang sah. Dalam kes ini, semakan jika (ini != &rhs) tidak begitu diperlukan. Walau bagaimanapun, ia masih boleh berguna sebagai pengoptimuman untuk mengelak daripada melaksanakan operasi bergerak pada penugasan kendiri.

Standard semasa dan akan datang:

C 11 standard tidak secara eksplisit mewajibkan tafsiran khusus bagi pengendali tugasan pindah. Walau bagaimanapun, ia membenarkan pengaturcara mentakrifkan gelagat melalui pelaksanaan pengendali penugasan pindah.

Draf kerja C 20 yang dicadangkan termasuk bahagian tugasan alih yang mencadangkan bahawa penugasan bergerak sendiri tidak boleh ranap, tetapi ia tidak menyatakan sama ada ia harus mengekalkan nilai semasa atau meninggalkan objek dalam sah tetapi tidak ditentukan nyatakan.

Kesimpulan:

Keperluan untuk semakan if (ini != &rhs) dalam operator penugasan pindah adalah soal tafsiran dan keperluan pelaksanaan khusus. Jika penugasan bergerak sendiri dijangka mengekalkan nilai semasa, maka semakan adalah perlu. Jika tidak, ia boleh diabaikan sebagai pengoptimuman.

Atas ialah kandungan terperinci Adakah Kita Memerlukan Operator Tugasan C Move `jika (ini != &rhs)` Daftar masuk?. 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