看看這兩個多載的函式模板:
template <class T>
int foo(T& x) { // #1
return 1;
}
template <class T>
int foo(T&& x) { // #2
return 2;
}
我foo通過以下方式呼叫:
int i;
foo(i); // calls #1
并且明確選擇了多載 #1:https : //gcc.godbolt.org/z/zchK1zxMW
這似乎是一種正確的行為,但我不明白為什么會發生這種情況(而且我實際上有一些不是我所期望的代碼)。
從多載解析度:
如果任何候選函式是函式模板,則使用模板引數推導生成其特化,并且此類特化被視為非模板函式,除非在決勝局規則中另有規定。
好的,讓我們生成專業。對于#1,這很容易,它變成了int foo(int& x). 對于#2 特殊扣除規則適用,因為它是轉發參考。i是一個左值,從而T推匯出作為int&和T&&變int& &&,這之后參考塌陷變得只是int&,得到的結果int foo(int& x)。這與#1 完全相同!
所以我希望看到一個模棱兩可的電話,這不會發生。任何人都可以請解釋為什么?在這里使用什么決勝局來選擇最佳可行功能?
另見Slack中的相關討論,有一些想法。
uj5u.com熱心網友回復:
非語言律師的回答是,對于這種情況,有一個決勝局規則。
充分理解標準措辭以解碼它需要一個簡短的書章。但是,當推導T&&與T&多載是在左值和其他所有關系之間選擇選項時,T&勝利。
這樣做是為了 (a) 使通用參考起作用,同時 (b) 如果您想單獨處理它們,則允許您多載左值參考。
決勝局來自模板函式多載“更專業”的排序規則。為什么同樣的理由T*優于T對指標,即使兩者T=Foo*并T=Foo給予同樣的功能引數。出現了模板引數的二次排序,并且T可以模擬T*手段的事實T*更加專業化(或者說不是,標準中的措辭很尷尬)。說明左值T&節拍的額外規則T&&位于同一部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/312596.html
