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
Lepaskan: 2024-10-29 13:58:02
asal
966 orang telah melayarinya

 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;
}
Salin selepas log masuk

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;
};
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan