Mengikat Rujukan Const kepada Sub-Objek Sementara: Satu Teka-teki
Coretan kod C di bawah menunjukkan percanggahan dalam tingkah laku antara penyusun yang berbeza apabila cuba untuk mengikat rujukan const kepada sub-objek sementara:
<code class="cpp">#include <stdio.h> struct P2d { double x, y; P2d(double x, double y) : x(x), y(y) {} ~P2d() { printf("Destructor called\n"); } }; P2d center() { return P2d(10, 10); } int main(int argc, const char *argv[]) { const double& x = center().x; // Bind a reference to temporary's x member printf("x = %.18g\n", x); // Expected: 10 return 0; }</code>
Pepijat atau Tingkah Laku yang Dijangka?
Penyusun seperti g menamatkan hayat contoh P2d sementara sebelum memasukkan printf dalam utama, tetapi nilai ganda ahli x masih dikekalkan. Ini dicapai dengan mencipta satu lagi pengganda sementara untuk menyalin nilai dan bukannya mengikat kepada ahli sementara asal.
Sebaliknya, denting memanjangkan hayat sementara P2d dengan betul supaya sepadan dengan rujukan x, membenarkan pemusnah yang akan dipanggil selepas printf in main.
Percanggahan ini menimbulkan persoalan: adakah tingkah laku g adalah pepijat atau dibenarkan di bawah standard C?
Analisis dan Penyelesaian
CWG 1651 memberi penerangan tentang isu ini:
Mengikat rujukan kepada sub-objek tidak seharusnya memanjangkan hayat objek sementara.
Di bawah piawaian semasa, objek selain skalar, seperti kelas atau tatasusunan, boleh memanjangkan hayat objek sementara.
Gelagat Pengkompil
Kesimpulan
Berdasarkan perkataan semasa standard C, tingkah laku GCC adalah betul dari segi teknikal, manakala pelaksanaan Clang mencerminkan perubahan yang dicadangkan dalam DR 1651. Kemungkinan standard akan disemak untuk mencerminkan perubahan ini pada masa hadapan.
Atas ialah kandungan terperinci Adakah Mengikat Rujukan Const kepada Sub-Objek Sementara dalam C Suatu Pepijat atau Tingkah Laku yang Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!