指針衰減和函數重載解析
在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中文網其他相關文章!