簡體   English   中英

非const指針更喜歡const T和重載到const T *

[英]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*) 標准中的任何地方都談到了這種反直覺的行為?

http://ideone.com/kl8NxL

對於使用模板推導的重載解析,第一步是解析模板。 然后將非模板排序應用於結果。 在您的代碼中,模板分辨率為:

void f(int * const &)   // 1

void f(int const *)     // 2

根據C ++ 14 [over.ics.ref],直接綁定到(1)中的參數的引用是一個標識轉換 (即使有添加的cv限定符)。 TT const &的綁定是直接綁定,即沒有創建和綁定臨時值。

但是,(2)涉及資格轉換 參數類型int *必須在與函數參數匹配之前轉換為const int *

身份轉換被認為是任何非身份轉換序列的子序列,因此(1)根據子序列規則獲勝[over.ics.rank] /3.1.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM