Rumah > pembangunan bahagian belakang > C++ > Bilakah Pereputan Penunjuk Mengatasi Potongan Templat dalam Resolusi Lebihan C?

Bilakah Pereputan Penunjuk Mengatasi Potongan Templat dalam Resolusi Lebihan C?

Patricia Arquette
Lepaskan: 2024-11-29 18:50:11
asal
335 orang telah melayarinya

When Does Pointer Decay Override Template Deduction in C   Overload Resolution?

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
Salin selepas log masuk

Untuk menyokong bukan tatasusunan, beban tambahan adalah ditambah:

void foo(const char* s) {
    std::cout << "raw, size=" << strlen(s) << std::endl;
}
Salin selepas log masuk

Tanpa disangka-sangka, lebihan beban pertama tidak lagi dipanggil:

foo("hello") // now prints raw, size=5
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan