1樓:一根筋的傻瓜
第二個部分的decltype出現在函式引數表之前,此時x,y還沒到達,所以這裡只能看到T,U這兩個模板引數,因為T,U是兩個型別,所以將0強制轉化為它們的指標,並取該指標的值,這樣就可以產生這兩個型別的產量相乘,就可以使用decltype了。
2樓:陸明非
decltype不會進行表示式運算,但會進行表示式型別推定.所以你只需要把型別弄正確就行了.如果直接放在返回值,因為a和b在解析返回值的時候看不到,所以你只能寫死型別.
c++14好像直接用auto,不需要trailing return type,在一些條件滿足的情況.
3樓:Sunchy321
只用decltype不用auto不應該是這樣的麼:
template
decltype(std::declval() * std::declval()) mul3(T x, U y)
4樓:熊孩子喬拉
如果返回值寫在前面的話,就無法利用變數x和y來推導返回值型別,只能用指標轉換(指標的值無關緊要,重要的是型別,因為推導型別的時候並不會真正的去求值)
還有種方法,但是不太完美,因為不是所有型別都具有預設建構函式。
template
decltype(T()*U()) mul3(T x, U y)
5樓:
C++ 11 不支援返回值 auto。C++ 14 才支援。
不支援返回值 auto 時,如果不想把 auto 和 ->decltype 聯用,怎麼表示 T 型別的值和 U 型別的值的乘積的型別呢?就只好用
decltype(*
(T*)
0**(U
*)0)
了。也就是把空指標 0 轉換為 T* 指標 (T*)0,解引用它得到乙個不存在的 T 型別值 *(T*)0*;類似得到乙個 U 型別值 *(U*)0*,算它們的乘積 *(T*)0**(U*)0,再用 decltype 得到這個乘積的型別。
所以到 C++14 就方便了。
template
typename U>auto mul(Tx ,Uy) 記憶體塊生命週期 解指標獲得實體用以傳參,傳的時候拷貝了乙份實體到被呼叫函式的棧,該副本作為被呼叫的自動變數。被呼叫函式生命週期即將結束時,析構了所屬於被調函式的自動變數。 Betty this本來就是指標了。你要列印位址,用printf p this 即可。使用printf p this 就尷尬了... VinaLx 回答題目 基本等價於變參模板的實現是可能的,但是語法上不能做到11之後那麼清爽 變參模板實際上就是乙個遞迴的型別列表,把這個東西實現出來其實就可以了struct VListNil template Value typename VList struct VariadicList tem... 暮無井見鈴 include intmain foo std cout foo n p this endl return0 可以用捕獲 this 的藍陀表示式再帶上 替換最後乙個非靜態成員的預設初始化器。但其他特殊成員函式似乎沒法手動定製 胖財 顯然沒有名字的類是沒法顯式寫構造的,但是我們有C 11的...C 11,在成員函式內使用printf p , this 會呼叫析構函式,這是為什麼?
請問在c 11之前,有什麼方法可以實現可變參的函式模板呢?
在 C 11 中,如何為匿名的結構體新增建構函式?