首頁 > 後端開發 > C++ > 主體

為什麼指標衰減會影響 C 函數模板中的重載解析?

DDD
發布: 2024-11-24 13:10:13
原創
670 人瀏覽過

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

指針衰減和函數重載解析

在C 中,重載解析旨在為給定的參數集選擇最匹配的函數。當多個函數都是可行的候選者時,首選轉換成本最小的函數。

考慮以下打印字元數組長度的函數模板:

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

當調用foo( “hello”),它成功識別了模板特化並輸出“array, size=5” 。然而,擴展 foo 以支援非數組場景會帶來歧義。

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

現在,呼叫 foo("hello") 會令人驚訝地列印“raw, size=5”,儘管模板特化看起來像是更精確的匹配。

歧義的原因

之所以會出現歧義,是因為數組本質上是指向其第一個元素的指針,使得數組到指針的轉換成本低廉。根據 C 重載解析規則,需要較少轉換操作的重載是受青睞的。在這種情況下,數組到指標的轉換是一種低成本的左值轉換,其排名高於必要的模板參數推導。

解決歧義

為了確保呼叫數組函數重載,解決方法是將非數組重載定義為函數模板,如下所示好吧:

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;
}
登入後複製

這確保了模板專業化被優先考慮,因為部分排序開始了。

以上是為什麼指標衰減會影響 C 函數模板中的重載解析?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板