Mengapakah Tugasan Berkemungkinan kepada Rnilai Jenis Kelas?
Dalam C , tugasan kepada ungkapan nilai secara amnya tidak boleh dilaksanakan. Walau bagaimanapun, tingkah laku ini nampaknya dilanggar dalam coretan kod di bawah:
class Y { public : explicit Y(std::size_t num = 0) {} }; int main() { Y(1) = Y(0); // Assignment to rvalue return 0; }
Penjelasan:
Bertentangan dengan jangkaan awal, kod ini berjaya disusun. Sebabnya terletak pada sintesis tersirat fungsi ahli, khususnya pengendali tugasan. Mengikut Piawaian C (bahagian 12.8 [class.copy], perenggan 18), jika pengendali tugasan tidak diisytiharkan atau ditandakan sebagai dipadam, pengkompil mensintesis satu. Untuk jenis kelas Y, pengendali tugasan yang disintesis akan mempunyai tandatangan berikut:
Perhatikan bahawa tandatangan ini tidak termasuk ref-qualifier (&) sebelum parameter. Oleh itu, pengendali tugasan yang disintesis boleh digunakan untuk ungkapan nilai.
Tingkah laku ini membenarkan tugasan kepada objek sementara yang dibuat dengan memanggil pembina: Y(1).
Pencegahan Kiri -Sementara Bahagian Tangan:
Untuk mengelakkan penciptaan objek sementara di sebelah kiri tugasan, anda boleh menggunakan teknik yang dipanggil "copy elision". Ini melibatkan pengisytiharan pengendali tugasan dengan kelayakan semula, seperti yang ditunjukkan dalam kod yang diubah suai berikut:
class Y { public : explicit Y(std::size_t num = 0); Y& operator= (Y const&) & = default; };
Dengan perubahan ini, pengendali tugasan yang disintesis tidak akan digunakan lagi untuk nilai.
Atas ialah kandungan terperinci Mengapa Kita Boleh Menetapkan kepada Rnilai Jenis Kelas dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!