Rumah >pembangunan bahagian belakang >C++ >Mengapa Kita Boleh Menetapkan kepada Rnilai Jenis Kelas dalam C?

Mengapa Kita Boleh Menetapkan kepada Rnilai Jenis Kelas dalam C?

Patricia Arquette
Patricia Arquetteasal
2024-10-29 13:58:02990semak imbas

 Why Can We Assign to Rvalues of Class Type in C  ?

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:

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

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!

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