關于轉發參考(又名通用參考)的整個前提是,這個函式:
template<typename T>
void f(T&&) { }
可能導致模板引數為int&或int,具體取決于您是否使用int a{}; f(a)或f(5)作為示例呼叫它。但我認為這已經是太過分了。因為當我有一個像
template<typename T>
auto g(T) -> void {}
然后它總是將模板引數決議為int,無論我如何呼叫它。雖然 aauto h(int&) -> void {}是完全合法的。
那么哪些規則允許模板引數 off成為參考,而不是g?
uj5u.com熱心網友回復:
對于函式引數具有T&&(cv-unqualified)形式的情況,模板引數推導規則中有一個特定的例外,其中T是模板引數。這種特殊情況在稱為轉發參考的問題中可見。
對于轉發參考,如果函式引數是左值,那么T通常不會推匯出參考型別的地方推匯出左值參考。
通過嘗試使用 egconst T&&而不是 ,您可以看到這確實是僅適用于這種情況T&&的特殊規則,特殊規則不適用。T在任何情況下,它都會推匯出非參考型別,盡管函式呼叫可能是不可能的。
uj5u.com熱心網友回復:
在有效的現代 C 第一章中,它說,我們可以將函式模板視為如下所示:
template<typename T>
void f(paramType param);
T并且paramType通常是不同的,paramType 通常包含像 const 或參考限定符這樣的裝飾const T&
他在三個案例中談到了這個
- paramType 是指標或參考型別
- paramType 是一個通用參考
- paramType 既不是指標也不是參考
你的第一個函式是 case2,因為它需要推斷型別,&&這里是一個通用參考,你的第二個函式是 case3,paramType 既不是指標也不是參考
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389655.html
下一篇:如何在c 中回傳未知值
