Kekaburan dalam Resolusi Lebihan: Pereputan Penunjuk vs. Potongan Templat
Dalam C , apabila fungsi terlampau beban tersedia, menentukan yang mana satu untuk dipanggil boleh jadi ambik. Satu kes sedemikian melibatkan pereputan penuding diutamakan daripada templat yang disimpulkan.
Akar Kekaburan
Pertimbangkan fungsi yang mencetak panjang rentetan:
template <size_t N> void foo(const char (&s)[N]) { std::cout << "array, size=" << N - 1 << std::endl; } foo("hello") // prints array, size=5
Untuk menyokong bukan tatasusunan, beban tambahan adalah ditambah:
void foo(const char* s) { std::cout << "raw, size=" << strlen(s) << std::endl; }
Tanpa disangka-sangka, lebihan beban pertama tidak lagi dipanggil:
foo("hello") // now prints raw, size=5
Reputan Penunjuk vs. Potongan Templat
Kekaburan timbul kerana tatasusunan pada dasarnya adalah penunjuk kepada elemen pertamanya. Pereputan penunjuk secara automatik menukar tatasusunan kepada penunjuk apabila menghantarnya sebagai hujah. Walau bagaimanapun, potongan templat akan menghasilkan padanan tepat dengan lebihan pertama.
Menurut piawaian C, resolusi beban lampau mengutamakan fungsi yang bukan pengkhususan templat fungsi (kecuali dalam kes tertentu). Dalam keadaan ini, penukaran tatasusunan kepada penuding ialah Transformasi Nilai L dengan keutamaan yang lebih rendah daripada potongan templat.
Memecahkan Kekaburan
Salah satu cara untuk menyelesaikan kekaburan ialah untuk menentukan bebanan kedua sebagai templat fungsi juga, membolehkan separa pesanan:
template <typename T> auto foo(T s) -> std::enable_if_t<std::is_convertible<T, char const*>{}> { std::cout << "raw, size=" << std::strlen(s) << std::endl; }
Dengan menyatakan kekangan jenis, pengkompil boleh menyimpulkan bahawa lebihan pertama harus digunakan untuk tatasusunan, manakala lebihan kedua mengendalikan bukan tatasusunan.
Ringkasnya, sementara pereputan penunjuk menawarkan jalan pintas untuk mengakses elemen pertama tatasusunan, ia boleh membawa kepada kekaburan yang tidak dijangka dalam resolusi beban lampau apabila templat terlibat. Pertimbangan berhati-hati terhadap bebanan fungsi dan penggunaan kekangan jenis yang bertimbang rasa adalah kunci untuk mengelakkan perangkap sedemikian.
Atas ialah kandungan terperinci Bilakah Pereputan Penunjuk Mengatasi Potongan Templat dalam Resolusi Lebihan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!