Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Pereputan Penunjuk Menjejaskan Resolusi Lebihan dalam Templat Fungsi C?

Mengapa Pereputan Penunjuk Menjejaskan Resolusi Lebihan dalam Templat Fungsi C?

DDD
DDDasal
2024-11-24 13:10:13671semak imbas

Why Does Pointer Decay Affect Overload Resolution in C   Function Templates?

Reputan Penunjuk dan Resolusi Lebihan Fungsi

Dalam C , resolusi beban lampau bertujuan untuk memilih fungsi pemadanan terbaik untuk set argumen tertentu. Apabila berbilang fungsi adalah calon yang berdaya maju, fungsi yang mempunyai kos penukaran minimum lebih diutamakan.

Pertimbangkan templat fungsi berikut yang mencetak panjang tatasusunan aksara:

template <size_t N>
void foo(const char (&s)[N]) {
    std::cout << "array, size=" << N - 1 << std::endl;
}

Apabila memanggil foo( "hello"), ia berjaya mengenal pasti pengkhususan templat dan mengeluarkan "array, size=5". Walau bagaimanapun, melanjutkan foo untuk menyokong senario bukan tatasusunan memperkenalkan kesamaran.

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

Kini, memanggil foo("hello") secara mengejutkan mencetak "mentah, saiz=5", walaupun pengkhususan templat kelihatan seperti padanan yang lebih tepat.

Sebabnya Kekaburan

Kekaburan timbul kerana tatasusunan pada asasnya adalah penunjuk kepada elemen pertamanya, menjadikan penukaran tatasusunan ke penuding murah. Menurut peraturan resolusi beban lampau C, lebihan beban yang memerlukan operasi penukaran yang lebih sedikit adalah diutamakan. Dalam kes ini, penukaran tatasusunan kepada penuding ialah Transformasi Nilai L kos rendah yang mempunyai kedudukan lebih tinggi daripada potongan hujah templat yang diperlukan.

Mengatasi Kekaburan

Untuk memastikan bahawa lebihan fungsi tatasusunan digunakan, penyelesaiannya adalah dengan mentakrifkan lebihan bukan tatasusunan sebagai templat fungsi sebagai baik:

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;
}

Ini memastikan pengkhususan templat diutamakan kerana pesanan separa bermula.

Atas ialah kandungan terperinci Mengapa Pereputan Penunjuk Menjejaskan Resolusi Lebihan dalam Templat Fungsi C?. 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