## Adakah Mengikat Rujukan Const kepada Sub-Objek Sementara Memanjangkan Jangka Hayatnya?

DDD
Lepaskan: 2024-10-26 07:22:30
asal
422 orang telah melayarinya

## Does Binding a Const Reference to a Sub-Object of a Temporary Extend Its Lifetime?

Rujukan Const Mengikat kepada Sub-Objek Sementara

Pertimbangkan kod berikut:

<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;
    printf("x = %.18g\n", x);
    return 0;
}</code>
Salin selepas log masuk

Dalam contoh ini, center() mengembalikan objek P2d sementara. Timbul persoalan: apakah jangka hayat objek sementara ini?

Perbezaan dalam Gelagat Pengkompil

Pengkompil yang berbeza mempamerkan tingkah laku yang berbeza:

  • g (versi 5.2.0) memusnahkan objek P2d sementara sebelum memasuki printf dalam utama. Walau bagaimanapun, ia mengekalkan nilai ahli xnya. Terutama, ia memanjangkan hayat sementara hanya jika subobjek adalah daripada jenis kelas atau tatasusunan.
  • clang memanjangkan hayat objek P2d sementara kepada jangka hayat rujukan x. Oleh itu, pemusnah dipanggil selepas printf dalam utama.

Menurut piawaian C, mengikat rujukan kepada sub-objek sementara tidak memanjangkan hayat sementara . Walau bagaimanapun, ini dilindungi oleh CWG 1651, yang mencadangkan perubahan untuk memanjangkan hayat dalam kes sedemikian.

Resolusi Tertunda

Status quo ialah hanya prvalues ​​dianggap sebagai merujuk kepada sementara. Walau bagaimanapun, ungkapan akses ahli, seperti center().x, dianggap prvalues ​​oleh kedua-dua g dan clang .

  • g tidak memanjangkan hayat apabila menggunakan subobjek skalar kerana [dcl .init.ref]/(5.2.1.1) tidak melindunginya.
  • clang sudah melaksanakan peraturan lanjutan seumur hidup "baharu", yang akan menjadi tingkah laku yang betul sebaik sahaja CWG 1651 diselesaikan .

Resolusi yang akan datang akan menjelaskan bahawa ungkapan akses ahli menghasilkan ungkapan sementara dan bahawa rujukan kepada ungkapan ini memanjangkan hayat objek sementara yang sepadan.

Atas ialah kandungan terperinci ## Adakah Mengikat Rujukan Const kepada Sub-Objek Sementara Memanjangkan Jangka Hayatnya?. 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
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!