Tingkah laku apabila mengikat rujukan malar kepada sub-objek sementara ditakrifkan oleh standard C dan berbeza-beza bergantung pada vendor pengkompil.
Menurut CWG 1651, hasil akses ahli atau ungkapan subskrip yang digunakan pada nilai harus dianggap sebagai nilai x. Ini menunjukkan bahawa pengikatan rujukan kepada subobjek sementara sedemikian tidak seharusnya memanjangkan hayat sementara.
Walau bagaimanapun, dalam contoh yang diberikan, kedua-dua penyusun menganggap center().x sebagai prvalue. GCC tidak memanjangkan hayat apabila menggunakan subobjek skalar kerana ia tidak dilindungi oleh [dcl.init.ref]/(5.2.1.1). Oleh itu, objek sementara boleh dimusnahkan lebih awal.
Sebaliknya, Clang telah melaksanakan resolusi tertunda kepada DR 1651, yang menyatakan bahawa jika E1 ialah ungkapan sementara dan E2 tidak menetapkan medan bit, maka E1 .E2 ialah ungkapan sementara. Memandangkan center() ialah ungkapan sementara mengikut takrifan ini, perkataan yang diubah suai dalam [class.temporary] /5 terpakai. Ia menyatakan dengan jelas bahawa objek sementara yang sepadan kekal sepanjang hayat rujukan.
Oleh itu, Clang memanjangkan hayat tika P2d sementara dalam kes ini, manakala GCC tidak.
Tingkah laku semasa dalam kedua-dua GCC dan Clang dijangka berubah setelah cadangan semakan kepada standard C diterima pakai.
Atas ialah kandungan terperinci ## **Adakah Mengikat Rujukan Malar kepada Sub-Objek Sementara Memanjangkan Hayatnya? A Tale of GCC and Clang**. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!