C 11學習筆記 返回型別後置語法

2021-08-14 04:51:18 字數 1150 閱讀 6041

原創 2023年06月22日 01:48:22

本次學習3個知識點: 

(1)auto推導型別 

(2)decltype推導表示式的型別 

(3)返回型別後置語法

泛型程式設計中經常遇到的寫乙個加法函式:

template

r add(t t, u u)

int a = 10;

float b = 20.0;

auto c = add(a, b);

這裡我們並不關心a+b結果的型別,故使用decltype推導返回值型別。這個add函式有沒有改進方法,畢竟既然外部不知道add內部是怎麼操作的、返回的結果應該是什麼型別。

根據這個想法,我們把上述例子改進為:

template

decltype(t + u) add(t t, u u)

邏輯上沒有問題,返回型別由decltype推導,但是無法編譯通過,原因是c++的返回值是前置語法,在返回值定義的時候引數變數還不存在,這裡會提示t、u尚未定義。

既然如此,那我們把decltype中的表示式稍微改進一下,以便編譯通過

template

decltype(t() + u()) add(t t, u u)

但t、u可能是沒有無引數的建構函式的類,利用乙個小技巧:0(或null)可以轉換成任意型別指標,改進為正確版本:

template decltype((*(t*)

0) + (*(u*)

0)) add(t t, u u)

功能無誤、編譯正確,但有點複雜,一點都不「c++11」。這裡要用到上面講的第3個知識點:返回型別後置語法,將decltype和auto結果起來完成返回值型別的推導,

template

auto add(t t, u u) -> decltype(t + u)

是不是特別簡潔~

初次看上述**,可能有乙個疑問就是會不會(t + u)會運算兩次,影響「效能」。絲毫不會,原因是decltype推到表示式型別是在編譯期完成的,並且不會真正計算表示式的值,型別sizeof推導表示式型別大小一樣。

【參考:祁宇《深入應用c++11**優化與工程級應用》】

14 C 11返回型別後置語法的使用

c 11新標準增加的auto不僅可以自動推斷變數型別,還能結合decltype來表示函式的返回值。這些新特性可以讓我們寫出更簡潔 更現代的 在泛型程式設計中,可能需要通過引數的運算來得到返回值的型別。我們看一下下面這個例子 includeusing namespace std template r ...

C 11語法auto推導返回

c 不允許直接推導auto返回型別,如果要用auto返回型別,需要用decltype 宣告尾返回型別 如下面 template auto add a x,b y decltype x y 呼叫方式還是和普通的模板元函式一樣 std cout add 5,8 std endl std cout add...

C 11 FAQ中文版 返回值型別後置語法

二28 year 2011 陳 良喬 c 11 faq 返回型別後置語法 考慮下面這段 template?mul t x,u y 函式mul 的返回型別要怎麼寫呢?當然,是 x y型別 但是這並不是乙個資料型別,我們如何才能一開始就得到它的真實資料型別呢?在初步了解c 0x之後,你可能一開始想到使用...