二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的基本思想是,允許非靜態...