templatedecltype(2 * a) doublevalue(t& a) // 用decltype推導返回型別
但是對於編譯器來說,是從左到右進行編譯的,decltype在進行推導時並不知道a的型別,所以這種寫法是編譯不過的。為了解決這個問題,於是引入了追蹤返回型別:
template
auto doublevalue(t& a) -> decltype(2 * a)
上面的**使用auto
和-> decltype
構成了追蹤返回型別,指定了返回型別的推導規則。不過以上的推導規則較為簡單,實際使用的時候只需要auto也能實現相同的效果(書中沒有指出這點)。
template
auto doublevalue(t& a) // 直接通過auto返回值來推導返回型別
因此,追蹤返回型別適用於更加複雜的情況。
簡化類成員函式
如下**,在定義成員函式返回型別時可以不用附加上類名作用域:
class example ;
public:
data getdata();
private:
data
data;
};// 原來的寫法
example::data example::getdata()
// 追蹤返回型別,不需要example::data
auto example::getdata()->
data
加強函式定義可讀性
int(*(*pfunc()) ()) ()
auto pfunc1() -> auto (*)() -> int(*)()
int main()
從以上**可以看到,pfunc和pfunc1定義的函式是相同的,其返回值都是乙個函式指標,該函式指標又指向另乙個返回函式指標的函式。使用追蹤返回型別之後,定義的邏輯更加清晰可讀。
另外,在書中例舉了**的例子,和本篇文章開頭一樣只需要用auto作為返回值就能實現,不需要用到追蹤返回型別。
深入理解C 11 筆記
include using namespace std classa a 對於含有堆記憶體的類,需要提供深拷貝的拷貝建構函式,避免預設的拷貝構造使用淺拷貝導致堆記憶體的重複刪除。a const a a m ptr new int a.m ptr 通過移動構造,a 作為函式引數,只使用淺拷貝避免臨時物...
《深入理解C 11》筆記 decltype
本篇將介紹decltype的用法。decltype與auto類似,也能進行型別推導,但是用法有一定的區別,decltype推導出的型別能作為型別宣告變數 int main decltype的應用 一種是decltype和typedef using的合用 using size t decltype s...
《深入理解C 11》筆記 強型別列舉
本篇開始介紹第五章的內容 強型別列舉。列舉enum的使用應該十分常見,用於定義同一類的資料。但是列舉其實存在一定的問題 enum male enum female 如上 如果兩個列舉中定義了相同名稱的列舉值,將會編譯報錯,因為列舉值並沒有自己的名字空間。針對這種情況,往往會通過名字空間來分割列舉值的...