C 模板引用引數傳遞的問題,為什麼沒有優先匹配基類的引用型別?

時間 2021-06-01 19:12:45

1樓:少年之翼

對於函式過載,標準定義了複雜的判定規則(在多引數的情況下可能會複雜到肉眼難以分辨的程度),認為「優先匹配基類的引用引數」是太天真了。

簡單理解就是乙個匹配要明顯優於其他才算作成功,否則就會被認為優勢太小不足以區分,故編譯不過。運算子的版本能夠通過(運算子也是函式呼叫,需要經過函式過載決議選定),即是經過標準規定的一大堆判定之後,被判優了,當然這裡就只有乙個待選函式,直接就選中了(《和print是不同的函式簽名)。

沒記錯的話,匹配基類引用是標準轉換,在函式過載決議的時候,並不一定是最優選(當存在另乙個版本在這個引數上,能不需要標準轉換就能匹配成功,或者所需標準轉換的程度更低)。模板過載函式是先匹配上引數,組成待選函式和非模板函式一起參與函式過載決議(模板函式優先順序低於非模板,這裡全是模板不存在此區分),那麼這裡不需要轉換的第一版在第乙個引數上,因為不需要標準轉換,而「明顯佔優「。

第三段的內容,記的不是很清楚。具體可以參見翻標準文件的Overloading一章,或者看看樓下有沒有大大補充。

以下是一段簡單的測試單碼,我這裡結果是312,和題主看到的情況一致。

template struct A {};

template struct B : A {};

template void f(T &, const int &, int = 0)

template void f(A &, const int &, int = 0)

template void f2(A &, const int &)

int main()

2樓:

不會匹配到了

template

inline OutIt print(OutIt out, const xml_node &node, int flags = 0)吧

C 模板右值引用推導的問題?

情況是這樣的 int i 10 foo i 首先進行 name lookup 找到了 2 個 foo,然後進行模板引數的歸約.第 1 個是 foo T with T int 第 2 個是 foo const T with T int 之後進行過載決議,優先順序從 完美匹配 型別提公升 型別轉換 依次...

既然引用計數在做 GC 時有效能問題,為什麼智慧型指標會廣泛應用它?

喬捷 因為C 實現不了GC,只能用RC。RC的主要缺點也不是什麼效能問題,效能並不比GC差,主要的問題是不能解決迴圈引用的問題。 從程式優化角度看,越上層掌握的資訊越多,所能做的優化越多,越有針對性。智慧型指標是乙個交付使用者的工具,因此可以把優化做到恰到好處。而放入到GC這麼乙個底層自然就失去了很...

C 中的 this 為什麼是指標而不是引用?

中二青年 這個是c 作者的個人主頁,可以看一下答案,裡面還回答了,為什麼引入ref的原因。Why is this not a reference?Because this was introduced into C really into C with Classes before referenc...