Rujukan Bukan Konst Lnilai dan Pengikatan Sementara
Dalam C , rujukan bukan const lvalue dijangka terikat pada lnilai yang sama atau jenis terbitan. Walau bagaimanapun, situasi tertentu, seperti mengikat objek sementara, boleh membawa kepada ralat.
Mengapa kod berikut sah?
int a; const double &m = a;
Dalam kes ini, rujukan terikat pada nilai l , dan kerana rujukan adalah const, lvalue tidak boleh diubah suai. Ini dibenarkan dalam C selagi jenisnya serasi.
Walau bagaimanapun, apabila cuba mengikat rujukan bukan nilai tetap kepada nilai jenis yang berbeza, ralat berlaku:
int a; double &m = a;
ralat: rujukan bukan nilai tetap untuk jenis 'double' tidak boleh terikat pada nilai jenis yang tidak berkaitan 'int'
Ralat ini ditimbulkan kerana tindakan sementara terlibat. Penukaran jenis tersirat daripada int kepada dua kali ganda mencipta objek sementara. Rujukan bukan const tidak boleh terikat pada objek sementara kerana ia memerlukan objek itu mempunyai jangka hayat dan lokasi yang diketahui. Objek sementara, mengikut sifatnya, wujud untuk tempoh terhad.
Visual Studio mungkin menyusun kod ini tanpa ralat disebabkan sambungan pengkompil yang membenarkan pengikatan kepada sementara dalam kes tertentu. Walau bagaimanapun, pengkompil seperti GCC akan membenderakan ralat ini dengan betul.
Contoh di bawah menunjukkan isu yang sama dengan jenis yang ditentukan pengguna:
struct Foo {}; Foo &obj = Foo(); // error: binding non-const reference to temporary
Memahami konsep ini adalah penting untuk pengendalian rujukan yang betul dalam C dan mengelakkan isu masa jalan yang berkaitan dengan seumur hidup objek.
Atas ialah kandungan terperinci Mengapa Rujukan Nilai Bukan Konst Tidak Boleh Terikat kepada Sementara dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!