問題:
為什麼帶有類型參數的函數const char * 優先於具有const char 類型參數的函數模板(&s)[N] 當兩者同等適用時?
根本原因:
歧義源自於相對的轉換成本。重載解析有利於需要較少轉換操作的函數。數組實際上是指向其第一個元素的指針,這意味著數組到指針的轉換成本低於聲明基於數組的函數模板。
標準解釋:
依C標準([over.match.best]/(1.3), (1.6)):
在這種情況下:
可能解決方法:
要優先考慮基於模板的函數,請將第二個重載也定義為函數模板:
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中文網其他相關文章!