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
Lepaskan: 2024-12-16 00:57:09
asal
654 orang telah melayarinya

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(); }
};
Salin selepas log masuk

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

Foo::Bar b = f.Baz();  // error
Salin selepas log masuk

Tidak dijangka, menggunakan 'auto' menyelesaikan isu:

auto b = f.Baz();         // ok
Salin selepas log masuk

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

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!

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