C C 程式設計 decltype

2021-08-21 06:56:45 字數 1549 閱讀 7095

作用:返回運算元指定表示式的型別。在這個過程中,編譯器會分析表示式並得到它的型別,卻不實際計算表示式的值

在存在初始化**的情況下,可以使用auto來自動決定變數的型別。還存在一種情況,我們希望變數的型別通過初始化**之外的表示式推斷得到。

假設有下面結構體:

struct point;
在其他地方,可能這樣定義point型別的變數/變數:

point point;

point* p1 = nullptr;

在c++中提供了另一種方式來決定變數的型別:decltype修飾符。利用它可以通過表示式的型別來決定變數的型別

decltype(point)* p2 = nullptr;
這兩種方式有什麼不同呢?當point的型別發生變化時,p1的型別需要一起修改,p2的型別就不需要修改

這和sizeof()的引數提倡使用變數名而不是資料型別是一樣的道理。

(1)auto用來實現變數的拷貝,包括變數值和型別。decltype只是用來獲取變數的型別,並沒有用其值來初始化新變數。

#include #include using namespace std;

extern const int a = 3;

int main()

總結:decltype根據乙個變數獲取資料型別,然後我們可以用資料型別來建立變數,陣列,指標等。

#include #include using namespace std;

extern const int a = 3;

void main()

; cout << typeid(dec).name() << endl; // int[10]

for (auto i:dec)

cin.get();

}

總結:auto只能拷貝乙個變數,decltype本質是為了拷貝型別。

(2)與const的關係

#include #include using namespace std;

int main()

總結:auto會忽略頂層const,decltype不會。auto編譯器推斷出的型別值可能會跟不同,比如頂層const,但是decltype會保留

#include using namespace std;

template void show(t *p) //模板指標

int main()

decltype是記憶體拷貝

#include using namespace std;

template void show(t *p) //模板指標

; for (auto i : num) }

int main()

c c 程式設計風格

1.程式設計風格 請寫出 bool flag 與 零值 比較的 if 語句。3分 標準答案 if flag if flag 如下寫法均屬不良風格,不得分。if flag true if flag 1 if flag false if flag 0 請寫出 float x 與 零值 比較的 if 語句...

C C 程式設計規範

1 注意 strncpy strncat等帶n版本的字串操作函式在源字串長度超出n標識的長度時,會將包括 0 結束符在內的超長字串截斷,導致 0 結束符丟失。這時需要手動為目標字串設定 0 結束符。char dst 11 注意 最好每次定義時初始化為0 dst 11 char src 0123456...

C C 程式設計例項

例項1 設某次體育比賽的結果有4中可能 勝 win 負 lose 平局 tie 比賽取消 cancel 編寫程式順序輸出這4中情況。知識點 主要是練習列舉型別enum的使用 編譯執行結果 例項2 將兩個整數交換次序後輸出。知識點 值傳遞是指當發生函式呼叫時,給形參來分配記憶體空間,並用實參來初始化形...