C 模板型別推斷和引用摺疊的聯絡?

時間 2021-06-06 19:37:42

1樓:王賽

左值和右值,指的不是變數本身的型別,而是變數構成的表示式值型別。表示式值型別是左值還是右值,有一套完整的定義規則,cppreference 上有,手機上答題,不方便找。

針對這個題目,三個變數做引數,都屬於 id expression,屬於 lvaue 表示式,對應的具體型別實際上是 int&。

那麼,模板推導型別時,帶入的是 int&,所以,第乙個模板推導的是 int,後兩個是 int&。

如果想匹配到右值引用,std::move一下。c++ 規定,std::move 後,表示式型別是 xvalue,對應的具體型別是 int&&。

多說一句,c++ 裡還有個表示式型別是 prvalue,例如常量 1,對應的型別是 int。如果你直接用常量 1 做第三個模板函式的引數,也能推導出右值引用型別。

2樓:土地測量員

template

T>voidf(

ParamType

param);f

(expr

);感覺題主是預設把T推導成expr的型別了...但是模板引數推導的規則並不是這樣。

建議看下effective modern c++,第一章就是講的模板引數推導,後面也會詳細講Forwarding reference 和引用摺疊。

或者看這個...

Template argument deduction

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

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

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

少年之翼 對於函式過載,標準定義了複雜的判定規則 在多引數的情況下可能會複雜到肉眼難以分辨的程度 認為 優先匹配基類的引用引數 是太天真了。簡單理解就是乙個匹配要明顯優於其他才算作成功,否則就會被認為優勢太小不足以區分,故編譯不過。運算子的版本能夠通過 運算子也是函式呼叫,需要經過函式過載決議選定 ...

python的引用和C 的引用不一樣嗎?

布客飛龍 不要拿 C 的設施,包括但不僅限於引用,區域性作用域,全域性作用域,函式來理解 Python。以及,同乙個名稱在不同語言裡面,不一定指代相同的東西。Python 為了避免這種情況,特意用了 繫結 這個詞。結果你們還是引用引用引用。 吶吶啵 python中,a 2,表示a是2的引用,b a,...