Dalam alam C , kepelbagaian auto sering menimbulkan rasa ingin tahu dan kadangkala kebingungan. Satu pemerhatian yang membingungkan timbul apabila menggunakan auto dengan jenis peribadi.
Pertimbangkan coretan kod berikut, yang secara mengejutkan menyusun tanpa ralat:
class Foo { struct Bar { int i; }; public: Bar Baz() { return Bar(); } }; int main() { Foo f; auto b = f.Baz(); // ok std::cout << b.i; }
Tingkah laku tidak konvensional ini menimbulkan persoalan: mengapa kita boleh mengakses jenis peribadi melalui auto manakala akses terus dilarang?
Untuk merungkai enigma ini, kita mesti mendalami mekanik auto. Peraturan potongan jenisnya sebahagian besarnya mencerminkan templat C. Pemerhatian ini berlaku untuk sampel kod yang disebutkan di atas. Sama seperti kita boleh menghantar objek jenis peribadi sebagai argumen kepada fungsi templat:
template <typename T> void fun(T t) {} int main() { Foo f; fun(f.Baz()); // ok }
kita juga boleh membuat kesimpulan jenisnya menggunakan auto. Ini kerana walaupun nama jenis itu sendiri kekal tidak boleh diakses, maklumat jenis masih tersedia. Ini membenarkan pengembalian jenis peribadi kepada kod pelanggan, membenarkan akses yang dilarang melalui auto.
Atas ialah kandungan terperinci Mengapakah `auto` Boleh Mengakses Jenis C Peribadi Apabila Akses Terus Dilarang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!