Rumah >pembangunan bahagian belakang >C++ >Mengapa 'auto' Berfungsi dengan Jenis Peribadi Walaupun Pengisytiharan Eksplisit Gagal?

Mengapa 'auto' Berfungsi dengan Jenis Peribadi Walaupun Pengisytiharan Eksplisit Gagal?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-16 00:57:09658semak imbas

Why Does 'auto' Work with Private Types While Explicit Declaration Fails?

Menggunakan 'auto' pada Jenis Peribadi: Kebolehcapaian Didedahkan

Apabila bekerja dengan jenis peribadi dalam kelas, anda mungkin menghadapi situasi yang ingin tahu: semasa cuba mengisytiharkan secara eksplisit pembolehubah menggunakan nama jenis menghasilkan ralat, menggunakan 'auto' untuk membuat kesimpulan jenis nampaknya berfungsi dengan lancar.

class Foo {
    struct Bar { int i; };
public:
    Bar Baz() { return Bar(); }
};

Dalam kod yang diberikan, Foo mengandungi Bar jenis bersarang peribadi. Melaksanakan baris berikut menimbulkan ralat:

Foo::Bar b = f.Baz();  // error

Tidak dijangka, menggunakan 'auto' menyelesaikan isu:

auto b = f.Baz();         // ok

Mengapa ini dibenarkan?

Kedua-dua potongan jenis 'auto' dan inferens jenis templat berkongsi mekanisme asas yang serupa. Dalam keadaan ini, ia menyerupai cara fungsi 'template' boleh berfungsi dengan jenis peribadi:

template <typename T>
void fun(T t) {}

int main() {
    Foo f;
    fun(f.Baz());         // ok
}

Menyingkap Kebolehcapaian

Keupayaan untuk menghantar objek jenis peribadi ke fungsi templat atau gunakan 'auto' untuk membuat kesimpulan jenisnya berpunca daripada fakta bahawa jenis itu sendiri kekal boleh diakses, walaupun namanya tersembunyi. Pengkompil, melalui potongan jenis, membongkar struktur objek, membolehkan penggunaannya.

Oleh itu, walaupun nama jenis peribadi tidak boleh diakses, maklumat jenisnya masih tersedia, membenarkan manipulasi melalui mekanisme seperti 'auto ' atau potongan templat.

Atas ialah kandungan terperinci Mengapa 'auto' Berfungsi dengan Jenis Peribadi Walaupun Pengisytiharan Eksplisit Gagal?. 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