Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apabila menggunakan \"auto\" dalam C 11, bagaimanakah ia menentukan sama ada pembolehubah ialah rujukan atau nilai?

Apabila menggunakan \"auto\" dalam C 11, bagaimanakah ia menentukan sama ada pembolehubah ialah rujukan atau nilai?

Susan Sarandon
Susan Sarandonasal
2024-11-04 11:24:021008semak imbas

When using

C 11 "auto" Jenis Potongan: Menyelesaikan Rujukan vs. Nilai

Dalam C 11, kata kunci "auto" menyediakan cara yang mudah untuk membuat kesimpulan secara automatik jenis pembolehubah. Walau bagaimanapun, apabila menggunakan "auto", adalah penting untuk memahami peraturan yang menentukan sama ada ia menyelesaikan kepada nilai atau rujukan.

Taip Peraturan Potongan untuk "auto":

Peraturan asas ialah "auto" mentafsirkan pengisytiharan pembolehubah itu sendiri, bukan jenis yang diwakilinya. Oleh itu, contoh berikut jelas menunjukkan bahawa "auto" menyelesaikan kepada nilai:

<code class="cpp">auto i = v.begin(); // Copy, as begin() returns an iterator by value</code>

Walau bagaimanapun, dalam senario yang lebih kompleks, perbezaannya mungkin kurang jelas. Pertimbangkan contoh berikut:

  • Kes 1: Rujukan atau Salin?
<code class="cpp">const std::shared_ptr<Foo>&amp; get_foo();
auto p = get_foo(); // Copy or reference?</code>

Dalam kes ini, "auto" menyimpulkan jenis daripada jenis pulangan fungsi get_foo(), yang merupakan rujukan kepada std::shared_ptr. Memandangkan pengisytiharan p menggunakan satu ampersand (&), ia diselesaikan kepada salinan, bukan rujukan.

  • Kes 2: Pembolehubah Statik - Salin atau Rujukan ?
<code class="cpp">static std::shared_ptr<Foo> s_foo;
auto sp = s_foo; // Copy or reference?</code>

Di sini, "auto" menyimpulkan jenis daripada pengisytiharan s_foo, iaitu std::shared_ptr. Memandangkan tiada ampersand dalam pengisytiharan sp, ia sekali lagi menyelesaikan kepada salinan.

  • Kes 3: Menggelung di Atas Bekas - Salinan untuk Setiap Lelaran?
<code class="cpp">std::vector<std::shared_ptr<Foo>> c;
for (auto foo: c) { // Copy for every loop iteration?</code>

Dalam kes ini, "auto" menyimpulkan jenis daripada jenis lelaran vektor. Iterator mengembalikan std::shared_ptr, yang merupakan jenis rujukan. Walau bagaimanapun, oleh kerana pengisytiharan foo menggunakan ampersand (&), ia menyelesaikan kepada nilai dinyahrujuk, iaitu salinan std::shared_ptr untuk setiap lelaran gelung.

Kesimpulan:

Peraturan untuk potongan jenis "auto" adalah mudah: ia mengikut pengisytiharan pembolehubah itu sendiri. Untuk menyelesaikan rujukan, gunakan ampersand dalam pengisytiharan (auto &ref = ...). Jika tidak, "auto" akan menyimpulkan jenis nilai.

Atas ialah kandungan terperinci Apabila menggunakan \"auto\" dalam C 11, bagaimanakah ia menentukan sama ada pembolehubah ialah rujukan atau nilai?. 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