Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Mengikat Objek Sementara kepada Rujukan Malar Memanjangkan Jangka Hayatnya dalam C ?

Mengapa Mengikat Objek Sementara kepada Rujukan Malar Memanjangkan Jangka Hayatnya dalam C ?

DDD
DDDasal
2024-11-02 17:03:02627semak imbas

Why Does Binding a Temporary Object to a Constant Reference Extend its Lifetime in C  ?

Mengembalikan Objek Sementara dan Mengikat kepada Rujukan Malar

Dalam C , memberikan objek sementara kepada rujukan tetap ialah operasi biasa yang pada mulanya mungkin menimbulkan persoalan tentang jangka hayat sementara.

Soalan:

Mengapa kod berikut sah dan tidak mengakibatkan ralat pengkompil?

<code class="cpp">string foo() {
  return string("123");
}

int main() {
  const string& val = foo();
  printf("%s\n", val.c_str());
  return 0;
}</code>

Jawapan:

C dengan jelas mentakrifkan bahawa mengikat objek sementara kepada rujukan berasaskan tindanan berterusan memanjangkan hayat sementara untuk dipadankan dengan rujukan. Dalam senario ini, sementara yang dikembalikan oleh foo() kekal sehingga akhir fungsi main().

Penjelasan:

  • Objek sementara biasanya mempunyai jangka hayat yang singkat, berakhir pada penghujung ungkapan yang ia muncul.
  • Walau bagaimanapun, C membenarkan pengecualian untuk rujukan const pada tindanan.
  • Dengan mengikat rujukan sementara kepada rujukan const pada tindanan. , jangka hayat sementara dilanjutkan agar sepadan dengan jangka hayat rujukan.
  • Ini menghalang ralat rujukan berjuntai yang disebabkan oleh rujukan yang menunjuk kepada objek yang telah dimusnahkan.

Nota:

  • Pengecualian ini hanya terpakai pada rujukan const berasaskan tindanan.
  • Ia tidak terpakai kepada rujukan yang merupakan ahli objek.
  • Untuk butiran lanjut, rujuk Herb Sutter "GotW #88: Calon Untuk "Konst Paling Penting"."

Atas ialah kandungan terperinci Mengapa Mengikat Objek Sementara kepada Rujukan Malar Memanjangkan Jangka Hayatnya dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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