《深入理解C 11》筆記 追蹤返回型別

2021-08-21 08:19:01 字數 1160 閱讀 6582

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 如上 如果兩個列舉中定義了相同名稱的列舉值,將會編譯報錯,因為列舉值並沒有自己的名字空間。針對這種情況,往往會通過名字空間來分割列舉值的...