Memahami Semantik "auto" C 11
Dalam C 11, kata kunci "auto" membenarkan potongan jenis automatik. Walau bagaimanapun, menentukan sama ada ia menyelesaikan kepada nilai atau rujukan kadangkala boleh menjadi samar-samar.
Peraturan Potongan Jenis:
Peraturan untuk potongan jenis dalam "auto" adalah mudah. : ia adalah berdasarkan cara objek diisytiharkan.
Contohnya:
<code class="cpp">int i = 5;</code>
Jika kami mengisytiharkan:
<code class="cpp">auto a1 = i; // value auto &a2 = i; // reference</code>
a1 akan ditolak sebagai jenis nilai (int), manakala a2 akan ditolak sebagai jenis rujukan (int&).
Kes Ambiguous:
Pertimbangkan contoh berikut:
<code class="cpp">const std::shared_ptr<Foo>& get_foo(); auto p = get_foo(); // Copy or reference?</code>
get_foo mengembalikan rujukan, tetapi p diisytiharkan sebagai "auto". Dalam kes ini, auto akan menyimpulkan jenis p untuk menjadi rujukan kepada Foo.
<code class="cpp">static std::shared_ptr<Foo> s_foo; auto sp = s_foo; // Copy or reference?</code>
s_foo ialah tika statik penuding dikongsi kepada Foo. sp diisytiharkan menggunakan "auto", jadi ia akan ditolak sebagai penuding kongsi kepada Foo.
<code class="cpp">std::vector<std::shared_ptr<Foo>> c; for (auto foo: c) { // Copy for every loop iteration?</code>
Di sini, "auto" akan berulang melalui vektor, dengan mengecilkan jenis foo untuk menjadi penuding kongsi kepada Foo. Ini bermakna penuding kongsi sementara baharu dibuat untuk setiap lelaran.
Demonstrasi:
Kod berikut menunjukkan konsep ini:
<code class="cpp">#include <typeinfo> #include <iostream> template< typename T > struct A { static void foo(){ std::cout << "value" << std::endl; } }; template< typename T > struct A< T&& > { static void foo(){ std::cout << "reference" << std::endl; } }; float& bar() { static float t=5.5; return t; } int main() { int i = 5; int &r = i; auto a1 = i; auto a2 = r; auto a3 = bar(); A<decltype(i)>::foo(); // value A<decltype(r)>::foo(); // reference A<decltype(a1)>::foo(); // value A<decltype(a2)>::foo(); // value A<decltype(bar())>::foo(); // reference A<decltype(a3)>::foo(); // value }</code>
Output:
value reference value value reference value
Atas ialah kandungan terperinci Bilakah \'auto\' Menyimpulkan Nilai atau Rujukan dalam C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!