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

2021-06-06 04:27:24 字數 1076 閱讀 6017

二28

year 2011

陳 良喬

c++11 faq

返回型別後置語法

考慮下面這段**:

template??? mul(t x, u y)

函式mul()的返回型別要怎麼寫呢?當然,是「x*y型別」,但是這並不是乙個資料型別,我們如何才能一開始就得到它的真實資料型別呢?在初步了解c++0x之後,你可能一開始想到使用decltype來推斷「x*y」的資料型別:

templatedecltype(x*y) mul(t x, u y) // 注意這裡的作用域

但是,這種方式是行不通的,因為x和y不在作用域內。但是,我們可以這樣寫:

template// 難看彆扭,且容易產生錯誤

decltype(*(t*)(0)**(u*)(0)) mul(t x, u y)

如果稱這種用法為「還可以」,就已經是過譽了。

c++11的解決辦法是將返回型別放在它所屬的函式名的後面:

templateauto mul(t x, u y) -> decltype(x*y)

這裡我們使用了auto關鍵字,(auto在c++11中還有根據初始值推斷資料型別的意義),在這裡它的意思變為「返回型別將會稍後引出或指定」。

返回值後置語法最初並不是用於模板和返回值型別縮減的,它實際是用於解決作用域問題的。

struct list ;

link* erase(link* p); // 移除p並返回p之前的鏈結

// ...

};list::link* list::erase(link* p)

第乙個list::是必需的,這僅是因為list的作用域直到第二個list::才有效。更好的表示方式是:

auto list::erase(link* p) -> link*
現在,將函式返回型別後置,link*就不需要使用明確的list::進行限定了。

參考:

C 11 FAQ中文版 繼承的建構函式

三2 year 2011 陳 良喬 c 11 faq 繼承的建構函式 人們有時會對類成員函式或成員變數的作用域問題感到困惑,尤其是,當基類與派生類的同名成員不在同乙個作用域內時 struct b struct d b b b b.f 4.5 可行 呼叫的到底是b f doube 還是d f int ...

C 11 FAQ中文版 類成員的內部初始化

三1 year 2011 陳 良喬 c 11 faq 類內部成員的初始化 在c 98標準裡,只有static const宣告的整型成員能在類內部初始化,並且初始化值必須是常量表示式。這些限制確保了初始化操作可以在編譯時期進行。例如 int var 7 class x c 11的基本思想是,允許非靜態...

C 11 FAQ中文版 類成員的內部初始化

三1 year 2011 陳 良喬 c 11 faq 類內部成員的初始化 在c 98標準裡,只有static const宣告的整型成員能在類內部初始化,並且初始化值必須是常量表示式。這些限制確保了初始化操作可以在編譯時期進行。例如 int var 7 class x c 11的基本思想是,允許非靜態...