[英]Non-const pointer prefers const T& overload to const T*
假設我有一個函數的兩個重載
template <typename T>
void f(const T&) {
cout << "f(T&)" << endl;
}
template <typename T>
void f(const T*) {
cout << "f(T*)" << endl;
}
為什么f(new int)
解析為f(const T&)
而不是f(const T*)
? 標准中的任何地方都談到了這種反直覺的行為?
對於使用模板推導的重載解析,第一步是解析模板。 然后將非模板排序應用於結果。 在您的代碼中,模板分辨率為:
void f(int * const &) // 1
void f(int const *) // 2
根據C ++ 14 [over.ics.ref],直接綁定到(1)中的參數的引用是一個標識轉換 (即使有添加的cv限定符)。 T
與T const &
的綁定是直接綁定,即沒有創建和綁定臨時值。
但是,(2)涉及資格轉換 。 參數類型int *
必須在與函數參數匹配之前轉換為const int *
。
身份轉換被認為是任何非身份轉換序列的子序列,因此(1)根據子序列規則獲勝[over.ics.rank] /3.1.1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.