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

為什麼 `const char*` 函數重載優於 `const char (&)[N]` 模板函數?

Mary-Kate Olsen
發布: 2024-11-26 18:04:08
原創
645 人瀏覽過

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

重載衝突:指標衰減與模板推導

問題:

為什麼帶有類型參數的函數const char * 優先於具有const char 類型參數的函數模板(&s)[N] 當兩者同等適用時?

根本原因:

歧義源自於相對的轉換成本。重載解析有利於需要較少轉換操作的函數。數組實際上是指向其第一個元素的指針,這意味著數組到指針的轉換成本低於聲明基於數組的函數模板。

標準解釋:

依C標準([over.match.best]/(1.3), (1.6)):

  • 非專用函數優於專用函數範本。
  • 如果兩個轉換具有相同的排名,則它們無法區分。

在這種情況下:

  • 從陣列到指標的轉換是具有精確匹配等級的左值轉換。
  • 排除左值轉換,轉換等級並不重要。
  • 因此,兩種轉換序列都不是更好,導致歧義和選擇 char const* 重載。

可能解決方法:

要優先考慮基於模板的函數,請將第二個重載也定義為函數模板:

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

此部分排序可確保基於範本的函數是適用時選擇。

以上是為什麼 `const char*` 函數重載優於 `const char (&)[N]` 模板函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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