Rumah >pembangunan bahagian belakang >C++ >Mengapakah `auto` Boleh Mengakses Jenis C Peribadi Apabila Akses Terus Dilarang?

Mengapakah `auto` Boleh Mengakses Jenis C Peribadi Apabila Akses Terus Dilarang?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-16 06:31:11869semak imbas

Why Can `auto` Access Private C   Types When Direct Access Is Forbidden?

Jenis Auto dan Peribadi: Menyingkap Teka-teki Kebolehcapaian

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!

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