Menyingkap Skop Fungsi Rakan Sebaris
Dalam labirin selok-belok C, memahami bidang fungsi rakan sebaris boleh menjadi tugas yang menakutkan . Untuk merungkai enigma ini, mari kita mendalami persoalan utama: apakah skop sebenar fungsi sedemikian?
Pengisytiharan Fungsi Rakan dalam Skop Ruang Nama
Apabila fungsi rakan sebaris diisytiharkan dalam kelas, secara mengejutkan, ia tidak secara automatik berada dalam skop kelas. Sebaliknya, ia mewujudkan kehadiran dalam skop ruang nama tertutup yang terdekat. Walau bagaimanapun, kewujudan ini masih dikaburkan, disembunyikan daripada pandangan oleh mata yang berjaga-jaga daripada pencarian yang tidak layak dan berkelayakan.
Masukkan Pencarian Bergantung pada Hujah: Laluan Menuju Kebolehlihatan
Walaupun sukar difahami fungsi rakan sebaris dalam carian standard, wujud suar harapan yang dikenali sebagai carian bergantung hujah (ADL). Pendekatan rahsia ini membolehkan pengkompil untuk mendedahkan fungsi tersembunyi apabila panggilan fungsi tidak layak dibuat dalam konteks objek atau ungkapan kelas yang mengandungi.
Manifestasi Kod Kekaburan Skop
Untuk menggambarkan kerumitan skop, pertimbangkan kod berikut coretan:
namespace foo { struct bar { friend void baz() {} void call_friend(); }; } int main() { foo::baz(); // can't access through enclosing scope of the class foo::bar::baz(); // can't access through class scope } namespace foo { void bar::call_friend() { baz(); // can't access through member function } }
Setiap percubaan untuk menggunakan fungsi baz() secara langsung gagal, menyerlahkan halangan halimunan yang menghalang akses terus melalui carian yang tidak layak dan layak. Walau bagaimanapun, dalam fungsi ahli call_friend(), baz() bersinar, tanpa halangan oleh kekangan skop, terima kasih kepada kuasa kebajikan ADL.
Mohor Kuasa Piawai
Penjelasan muktamad tentang tingkah laku yang membingungkan ini terdapat dalam ISO/IEC 14882:2011 standard:
"Setiap nama yang pertama kali diisytiharkan dalam ruang nama ialah ahli ruang nama itu. Jika pengisytiharan rakan dalam kelas bukan tempatan mula-mula mengisytiharkan kelas atau fungsi kelas atau fungsi rakan ialah ahli yang paling dalam melampirkan ruang nama. Nama rakan tidak ditemui oleh carian yang tidak layak (3.4.1) atau oleh carian yang layak (3.4.3) sehingga pengisytiharan yang sepadan disediakan dalam itu skop ruang nama (sama ada sebelum atau selepas definisi kelas yang memberikan persahabatan Jika fungsi rakan dipanggil, namanya boleh ditemui dengan carian nama yang menganggap fungsi daripada ruang nama dan kelas yang dikaitkan dengan jenis argumen fungsi (3.4.2) ."
Petikan ini menggariskan sifat sementara fungsi rakan yang diisytiharkan tanpa kelayakan ruang nama yang jelas. Mereka mendiami alam halus ruang nama tertutup dan kekal sukar difahami oleh pandangan biasa, kecuali apabila dipanggil melalui upacara mistik ADL.
Atas ialah kandungan terperinci Apakah Skop Fungsi Rakan Sebaris dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!