語言基礎(10) auto與decltype

2022-08-13 18:18:16 字數 2030 閱讀 1192

**

一般來說, 在把乙個表示式或者函式的返回值賦給乙個物件的時候, 我們必須要知道這個表示式的返回型別, 但是有的時候我們很難或者無法知道這個表示式或者函式的返回型別.(特別在模板中) 這個時候, 我們就可以使用auto關鍵字來讓編譯器幫助我們分析表示式或者函式所屬的型別. 比如:

1 auto item = val1 + val2;

2 auto red = layercolor::create(color4b(255, 100, 100, 255), 200, 100);

如果val1和val2都是int型別, 那麼item也是int型別, 如果val1和val2是double型別, 那麼item就是double型別. 而create()的返回值型別有可能會很複雜, 我們可以不用管, 這就使我們程式設計更加方便簡單

auto會忽略掉頂層const, 保留底層const.  舉例:

1 const int i = 5;

2 auto a = i;        // 變數i是頂層const, 會被忽略, 所以b的型別是int

3 auto b = &i;    // 變數i是乙個常量, 對常量取位址是一種底層const, 所以b的型別是const int *

因此, 如果希望推斷出的型別是頂層const的, 那麼就需要在auto前面加上cosnt:

1 const auto c = i;

anto會忽略表示式的引用型別,返回引用所指物件的型別

① 如果表示式是引用型別, 那麼auto的型別是這個引用的物件的型別.

1 int i = 2, &ri = i;

2 auto k = ri;            // k是int型別, 而不是引用型別

② 如果要宣告乙個引用, 就必須要加上&, 如果要宣告為乙個指標, 既可以加上也可以不加

1 int i = 3;

2 auto &refi = i;        // refi是乙個int型別的引用

3 auto p1 = &i;       // 此時推斷出來的型別是int, p1是指向int的指標

4 auto p2 = &i;        // 此時推斷出來的型別是int, p2是指向int的指標

decltype只是為了推斷出表示式的型別而不用這個表示式的值來初始化物件.

1 decltype(func()) sum = x; // sum的型別是函式func()的返回值的型別, 但是這時不會實際呼叫函式func()

2 int i = 0;

3 decltype(i) j = 4; // i的型別是int, 所以j的型別也是int

不論是頂層const還是底層const, decltype都會保留   

1 const int i = 3;

2 decltype(i) j = i; // j的型別和i是一樣的, 都是const int

decltype直接返回表示式的實際型別,包括表示式的引用型別

① 如果表示式是引用型別或者返回引用型別, 那麼decltype的型別也是引用

1 const int i = 3, &j = i;

2 decltype(j) k = 5;  // k的型別是 const int &

decltype(i+0) p = i; // p的型別是 const int &

② 如果表示式是引用型別, 但是想要得到這個引用所指向的型別, 需要修改表示式:

1 int i = 3, &r = i;

2 decltype(r + 0) t = 5; // 此時是int型別

③ 對指標的解引用操作返回的是引用型別

1 int i = 3, j = 6, p = &i;

2 decltype(p) c = j; // c是int型別的引用, c和j繫結在一起

④ 如果乙個表示式的型別不是引用, 但是我們需要推斷出引用, 那麼可以加上一對括號, 就變成了引用型別了

1 int i = 3;

2 decltype((i)) j = i; // 此時j的型別是int型別的引用, j和i繫結在了一起

C語言基礎10

9 結構體 共用體 列舉 巨集定義 預處理 9.1 結構體 9.1.1 為什麼需要結構體?沒有結構體之前,在c語言中,資料的組織依靠 變數 陣列。最初最簡單的時候,只需要使用基本資料型別 int char float double 來定義單個變數,需要幾個變數就定義幾個。後來情況變複雜了,有時需要很...

Python基礎10 類與物件

1 物件導向技術簡介 類定義語法格式 class classname 類例項化後,可以使用其屬性,實際上,建立乙個類之後,可以通過類名訪問其屬性。類物件類物件支援兩種操作 屬性引用和例項化。屬性引用使用和 python 中所有的屬性引用一樣的標準語法 obj.name。類物件建立後,類命名空間中所有...

MOOC Python語言基礎與應用

容器型別 字典 dict 貼標籤的資料 標籤收納盒 給資料貼上標籤,就可以通過具有特定含義的名字或者別的記號來獲取資料。現實生活中的字典 通過標籤 或者關鍵字 來索引資料,區別於列表或元組通過連續的整數來索引 ps 注意區別 標籤 key 和資料值 value 字典容器中儲存著一系列的key val...