在C 11裡面,只用decltype而不用auto,為什麼是這樣的

時間 2021-06-01 00:12:37

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)

C 11,在成員函式內使用printf p , this 會呼叫析構函式,這是為什麼?

記憶體塊生命週期 解指標獲得實體用以傳參,傳的時候拷貝了乙份實體到被呼叫函式的棧,該副本作為被呼叫的自動變數。被呼叫函式生命週期即將結束時,析構了所屬於被調函式的自動變數。 Betty this本來就是指標了。你要列印位址,用printf p this 即可。使用printf p this 就尷尬了...

請問在c 11之前,有什麼方法可以實現可變參的函式模板呢?

VinaLx 回答題目 基本等價於變參模板的實現是可能的,但是語法上不能做到11之後那麼清爽 變參模板實際上就是乙個遞迴的型別列表,把這個東西實現出來其實就可以了struct VListNil template Value typename VList struct VariadicList tem...

在 C 11 中,如何為匿名的結構體新增建構函式?

暮無井見鈴 include intmain foo std cout foo n p this endl return0 可以用捕獲 this 的藍陀表示式再帶上 替換最後乙個非靜態成員的預設初始化器。但其他特殊成員函式似乎沒法手動定製 胖財 顯然沒有名字的類是沒法顯式寫構造的,但是我們有C 11的...