C++11 尾置返回類型

尾置返回類型

尾置返回類型(trailing return type)是C++11中新增的特性副编,任何函數(shù)的定義都可以使用尾置返回類型录煤,但是尾置返回類型更適合用于返回類型比較復雜的場景,如返回一個數(shù)組指針橘荠。下面的例子是返回一個指向維度為10的數(shù)組指針的函數(shù)定義方法:

 int (*func(int i))[10]

下面逐層理解上述例子的含義:

  • func(int i)表示調(diào)用函數(shù)時幌衣,需要一個int類型的參數(shù)矾削;
  • (*func(int i))表示對調(diào)用func的結(jié)果執(zhí)行解引用的操作;
  • (*func(int i))[10]表示解引用之后得到一個維度為10的數(shù)組豁护;
  • int (*func(int i))[10]表示數(shù)組的數(shù)據(jù)類型為int哼凯;

若使用尾置返回類型,上述函數(shù)的定義可以寫成:

auto func(int i)->int (*)[10]

使用尾置返回類型之后楚里,函數(shù)的定義更加清晰易懂断部;同時注意到,尾置類型通常要和auto結(jié)合使用班缎。

尾置lambda的返回類型

默認情況下蝴光,如果一個lambda中包含一個return之外的任何語句,編譯器將假定此lambda的返回void吝梅。如下面的例子將vector中的負數(shù)轉(zhuǎn)成正數(shù):

std::vector<int> v {1, -9, 8, -3, 5};
transform(v.begin(), v.end(), v.begin(), [](int i){return i<0 : -i : i;});

上面的例子可以正常編譯通過虱疏,若修改成if/else的形式這編譯無法通過:

std::vector<int> v {1, -9, 8, -3, 5};
transform(v.begin(), v.end(), v.begin(), [](int i){
    if (i<0) return -i; else return i;
});

下面的這段描述來自 《C++ Primer》(第5版)惹骂,我分別在gcc4.8.5和gcc5.4.0的環(huán)境上測試了苏携,都無編譯錯誤,也許高版本的編譯器對此有優(yōu)化对粪。感謝boringcat的指正右冻。

此時lambda表達式默認返回類型為void装蓬,而return了一個int,因此無法編譯通過纱扭。上述的例子可以通過尾置返回類型來指定具體的返回類型牍帚,如:

std::vector<int> v {1, -9, 8, -3, 5};
transform(v.begin(), v.end(), v.begin(), [](int i) -> int {
    if (i<0) return -i; else return i;
});

尾置模板的返回類型

模板函數(shù)定義和調(diào)用如下:

template<typename R, typename T, typename U>
R add(T t, U u)
{
    return t+u;
}

int a =1; 
float b = 2.0;
auto c = add<decltype(a+b)>(a, b);

問題:add函數(shù)的返回類型能否通過decltype獲取呢?

template<typename R, typename T, typename U>
decltype(t+u) add(T t, U u) // error: t乳蛾、u尚未定義 
{
    return t+u;
}

上述在使用decltype(t+u)時暗赶,t、u尚未定義肃叶,編譯失旛逅妗;

問題:能否通過decltype(T()+U())推導呢因惭?不一定可以岳锁,因為T、U可能不包含無參數(shù)的構(gòu)造函數(shù)蹦魔。但可以按照下面方式修改:
decltype( (*(T*)0) + (*(U*)0) )
雖然上述方式可以解決問題激率,但是寫法很晦澀,通過auto勿决、decltype和尾置返回類型乒躺,可以清晰的寫出上述的邏輯。

template<typename R, typename T, typename U>
auto add(T t, U u) ->decltype(u+t)
{
    return t+u;
}

一個函數(shù)wrapper

int& func(int& i );
float func(int& f);

template<typename T>
auto func(T& val) -> decltype(func(val))
{
    return func(val);
}

尾置返回類型和auto剥险、decltype的結(jié)合聪蘸,可以有效的解決函數(shù)返回類型依賴于參數(shù)推導來確定的問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末表制,一起剝皮案震驚了整個濱河市健爬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌么介,老刑警劉巖娜遵,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異壤短,居然都是意外死亡设拟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門久脯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纳胧,“玉大人,你說我怎么就攤上這事帘撰∨苣剑” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長核行。 經(jīng)常有香客問我牢硅,道長,這世上最難降的妖魔是什么芝雪? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任减余,我火速辦了婚禮,結(jié)果婚禮上惩系,老公的妹妹穿的比我還像新娘位岔。我一直安慰自己,他們只是感情好堡牡,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布赃承。 她就那樣靜靜地躺著,像睡著了一般悴侵。 火紅的嫁衣襯著肌膚如雪瞧剖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天可免,我揣著相機與錄音抓于,去河邊找鬼。 笑死浇借,一個胖子當著我的面吹牛捉撮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妇垢,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼巾遭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闯估?” 一聲冷哼從身側(cè)響起灼舍,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涨薪,沒想到半個月后骑素,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡刚夺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年献丑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侠姑。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡创橄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莽红,到底是詐尸還是另有隱情妥畏,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站咖熟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柳畔。R本人自食惡果不足惜馍管,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望薪韩。 院中可真熱鬧确沸,春花似錦、人聲如沸俘陷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拉盾。三九已至桨菜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捉偏,已是汗流浹背倒得。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留夭禽,地道東北人霞掺。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像讹躯,于是被迫代替她去往敵國和親菩彬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容