Rumah >pembangunan bahagian belakang >C++ >Bilakah `auto` dalam C 11 menyimpulkan nilai atau rujukan?

Bilakah `auto` dalam C 11 menyimpulkan nilai atau rujukan?

Linda Hamilton
Linda Hamiltonasal
2024-11-03 15:35:021014semak imbas

When does `auto` in C  11 deduce a value or a reference?

Kehalusan Semantik "auto" C 11

Dalam C 11, kata kunci auto menawarkan cara yang mudah untuk menyimpulkan secara automatik jenis pembolehubah berdasarkan pemulanya . Walau bagaimanapun, terdapat нюансы tertentu untuk dipertimbangkan sama ada auto akan menyelesaikan kepada nilai atau rujukan.

Memahami Peraturan

Peraturannya adalah mudah: ia bergantung pada cara pembolehubah diisytiharkan.

<code class="cpp">int i = 5;
auto a1 = i;    // value
auto &a2 = i;  // reference</code>

Dalam kes pertama, a1 ialah nilai kerana ia tidak diisytiharkan sebagai rujukan. Dalam kes kedua, a2 ialah rujukan kerana ia telah diisytiharkan secara eksplisit sebagai satu.

Menjelaskan Ketidakpastian

Mari gunakan peraturan ini pada contoh yang anda berikan:

  • auto p = get_foo();: get_foo() mengembalikan rujukan kepada penunjuk pintar. Memandangkan p diisytiharkan tanpa rujukan, ia akan menjadi salinan, menghasilkan objek jenis rujukan.
  • auto sp = s_foo;: s_foo ialah rujukan statik kepada penunjuk pintar. Apabila memberikannya kepada sp, rujukan akan disalin, menghasilkan objek jenis rujukan.
  • untuk (auto foo: c): foo akan menjadi salinan setiap lelaran dalam vektor kerana ia tidak diisytiharkan sebagai rujukan.

Bukti dengan Pengaturcaraan Meta Templat

Kod berikut menunjukkan tingkah laku ini menggunakan pengaturcaraan meta templat:

<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&amp;>
{
    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

Ini mengesahkan bahawa jenis auto ditentukan oleh pengisytiharannya, bukan oleh jenis pemulanya.

Atas ialah kandungan terperinci Bilakah `auto` dalam C 11 menyimpulkan nilai atau rujukan?. 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