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
Lepaskan: 2024-11-02 21:52:30
asal
495 orang telah melayarinya

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>
Salin selepas log masuk

Jika kami mengisytiharkan:

<code class="cpp">auto a1 = i;    // value
auto &a2 = i;  // reference</code>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Output:

value
reference
value
value
reference
value
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan