重載解析中的歧義:指標衰減與模板推導
在C 中,當重載函數可用時,決定呼叫哪個函數可以模稜兩可。其中一種情況涉及指針衰減優先於推導模板。
歧義的根源
考慮一個列印字串長度的函數:
為了支援非數組,額外的重載是新增:
意外的是,第一個重載不再被呼叫:
指針衰減與模板推導
歧義之所以出現這種情況,是因為數組本質上是指向其第一個元素的指針。當陣列作為參數傳遞時,指標衰減會自動將陣列轉換為指標。但是,模板推導將導致與第一個重載完全匹配。
根據 C 標準,重載解析優先考慮不是函數模板特化的函數(某些情況除外)。在這種情況下,數組到指標的轉換是左值轉換,其優先權低於模板推導。
打破歧義
解決歧義的一種方法是將第二個重載也定義為函數模板,啟用部分排序:
By指定型別約束,編譯器可以推論出第一個重載應該用於數組,而第二個重載則處理非數組。
總之,雖然指針衰減提供了訪問第一個元素的快捷方式數組,當涉及模板時,它可能會導致重載決策中出現意外的歧義。仔細考慮函數重載和深思熟慮地使用類型約束是避免此類陷阱的關鍵。
以上是C 重載解析中指針衰減何時會覆蓋模板推導?的詳細內容。更多資訊請關注PHP中文網其他相關文章!