Rumah > pembangunan bahagian belakang > C++ > Mengapakah Fungsi `const char*` Lebih Beban Diutamakan Melebihi Fungsi Templat `const char (&)[N]`?

Mengapakah Fungsi `const char*` Lebih Beban Diutamakan Melebihi Fungsi Templat `const char (&)[N]`?

Mary-Kate Olsen
Lepaskan: 2024-11-26 18:04:08
asal
673 orang telah melayarinya

Why Does a `const char*` Function Overload Prevail Over a `const char (&)[N]` Template Function?

Melebihi Konflik: Pereputan Penunjuk lwn. Potongan Templat

Soalan:

Mengapa fungsi dengan parameter jenis const char* diutamakan daripada templat fungsi dengan parameter jenis const char (&s)[N] apabila kedua-duanya adalah sama terpakai?

Punca Punca:

Kekaburan berpunca daripada kos relatif penukaran. Peleraian beban lampau mengutamakan fungsi yang memerlukan kurang operasi penukaran. Tatasusunan secara berkesan adalah penunjuk kepada elemen pertamanya, membayangkan bahawa kos penukaran tatasusunan ke penuding kurang daripada mengisytiharkan templat fungsi berasaskan tatasusunan.

Penjelasan Standard:

Mengikut standard C ([over.match.best]/(1.3), (1.6)):

  • Fungsi bukan khusus diutamakan berbanding templat fungsi khusus.
  • Jika dua penukaran mempunyai kedudukan yang sama, ia tidak dapat dibezakan.

Dalam kes ini:

  • Penukaran daripada tatasusunan kepada penuding ialah Transformasi Nilai dengan kedudukan Padanan Tepat.
  • Tidak termasuk Transformasi Nilai L, kedudukan penukaran adalah tidak penting.
  • Oleh itu, kedua-dua jujukan penukaran tidak lebih baik, yang membawa kepada kekaburan dan pemilihan char const* yang berlebihan.

Mungkin Penyelesaian:

Untuk mengutamakan fungsi berasaskan templat, tentukan terlebih beban kedua sebagai templat fungsi juga:

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

Penyusunan separa ini memastikan fungsi berasaskan templat adalah dipilih apabila berkenaan.

Atas ialah kandungan terperinci Mengapakah Fungsi `const char*` Lebih Beban Diutamakan Melebihi Fungsi Templat `const char (&)[N]`?. 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