Rumah >pembangunan bahagian belakang >C++ >Bilakah \'auto\' Menyimpulkan Nilai atau Rujukan dalam C 11?

Bilakah \'auto\' Menyimpulkan Nilai atau Rujukan dalam C 11?

Linda Hamilton
Linda Hamiltonasal
2024-11-02 21:52:30577semak imbas

When Does

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!

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