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

2022-10-09 16:21:12 字數 1483 閱讀 1447

c++11新標準增加的auto不僅可以自動推斷變數型別,還能結合decltype來表示函式的返回值。這些新特性可以讓我們寫出更簡潔、更現代的**。

在泛型程式設計中,可能需要通過引數的運算來得到返回值的型別。

我們看一下下面這個例子:

#includeusing

namespace

std;

template

r add(t t,u u)

intmain()

我們並不關心a+b型別是什麼,因為,只需要通過decltype(a+b)直接得到返回值型別即可。但像上面這樣使用十分不方便,因為外部其實並不知道引數之間應該如何運算,只有add函式才知道返回值應當如何推導。

那麼我們可不可以直接在函式定義上通過decltype拿到返回值呢?比如像這樣:

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

編譯錯誤,t,u未定義

執行後,編譯器會提示錯誤,告訴我們decltype(t+u)中t和u在此作用域中尚未宣告。

因為t、u在引數列表中,而c++的返回值是前置語法,在返回值定義的時候引數變數還不存在。

對於本例子,可行的寫法如下:

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

考慮到t、u可能是沒有無參建構函式的類,正確的寫法應該是這樣:

template decltype((*(t*)0)+(*(u*)0

)) add(t t,u u)

雖然成功地使用decltype完成了返回值的推導,但寫法過於晦澀,會大大增加decltype在返回值型別推導上的使用難度並降低了**的可讀性。

因此,在c++11中增加了返回型別後置語法,將decltype和auto結合起來完成返回值型別的推導。

返回型別後置語法是通過auto和decltype結合起來使用的。上面的add函式,使用新的語法可以寫成:

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

為了進一步說明這個語法,再看另乙個例子:

#includeusing

namespace

std;

int& foo(int&i);

float foo(float&f);

template

auto func(t& val) ->decltype(foo(val))

在這個例子中,使用decltype結合返回值後置語法很容易推導出了foo(val)可能出現的返回值型別,並將其用到了func上。

返回值型別後置語法,是為了解決函式返回值型別依賴於引數而導致難以確定返回值型別的問題。有了這種語法以後,對返回值型別的推導就可以用清晰的方式描述出來。

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

原創 2016年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...

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

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

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...