Adakah Mengikat Rujukan Const kepada Sub-Objek Sementara dalam C Suatu Pepijat atau Tingkah Laku yang Dijangka?

Linda Hamilton
Lepaskan: 2024-10-26 11:26:29
asal
821 orang telah melayarinya

Is Binding a Const Reference to a Temporary Sub-Object in C   a Bug or Expected Behavior?

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

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

  • GCC: Memanjangkan hayat hanya untuk kelas atau subobjek tatasusunan, berdasarkan resolusi CWG 1651.
  • Clang: Sudah melaksanakan peraturan lanjutan seumur hidup yang digariskan dalam N3918, yang memanjangkan hayat untuk semua subjek sementara.

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!

sumber:php.cn
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!