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!