C++11 auto 和 decltype 的區別
阿新 • • 發佈:2021-12-13
1.auto
我們在宣告一個變數時,需要預先知道我們要宣告的變數是什麼型別,但有的變數型別是比較長,比較難以書寫,或有的時候比較困難推演出表示式的型別,特別是在泛型模板程式設計中的時候。
所以 C++11 就引入了 auto 型別說明符,讓編譯器去分析表示式所屬的型別,因為編譯器需要推算表示式的型別,所以在使用 auto 的時候,必須要給它一個初始值!不然編譯器不知道如何去推算
例如:
int i = 0; // i 為 int
auto a = 10; // a 為 int
auto b = i; // b 為 int
auto c; // 錯誤,沒有初始值
2.decltype
基於 auto ,有時候我們想知道從表示式中推算出要定義的變數型別,但是又不想用該表示式的值作為初始化。這怎麼辦呢
為滿足這要求,C++11 引入了第二個型別說明符 decltype !
decltype 的作用是選擇並返回運算元的資料型別。
例如:
#include <iostream>
using namespace std;
// 測試函式
double Fun(int &a, int &b)
{
return 0;
}
// 主函式
int main()
{
int x = 0;
int y = 0;
decltype(0) a = 0; // a 是 int
decltype(x) b = 0; // b 是 int
decltype(Fun(x, y)) c; // c 是 double且非必要初始化
return 0;
}
3.auto 和 decltype 不同點
auto 和 decltype 功能類似,但有也一些不同的地方
#include <iostream> using namespace std; // 主函式 int main() { const int const_value = 10; // const int const int &const_value1 = const_value; // const int& int value = 10; // int int &value2 = value; // int& int *value3 = &value; // int* // 測試1 auto A1 = const_value; // A1 為 int,auto 忽略了頂級const decltype(const_value) B1 = 0; // B1 為 const int // 測試2 auto A2 = const_value1; // A2 為 int,auto 忽略了頂級const和引用 decltype(const_value1) B2 = A1; // B2 為 const int& // 測試3 auto A3 = value; // A3 為 int decltype(value) B3; // B3 為 int // 測試4 auto A4 = value2; // A4 為 int,auto 忽略了引用 decltype(value2) B4 = value; // B4 為 int& // 測試5 auto A5 = *value3; // A5 為解引用後 int 型別 decltype(*value3) B5 = value; // A5 為 int& return 0; }
以上可看出 auto 和 decltype 的區別在於 const 和非 const 與引用和非引用的區別
1.auto 會忽略頂級 const
2.auto 會忽略引用
3.auto 在表示式為解引用時,會返回解引用型別
4.decltype 在表示式為解引用時,會返回引用型別
另外:declptye 還有個特別注意的地方
注意1
declptye((exp)) : 恆定返回引用型別!
declptye(exp) : 只有 exp 是引用型別,才返回引用型別
注意2
看以下程式碼
#include <iostream>
using namespace std;
int Fun(int& a, int& b)
{
a = 0;
b = 0;
return 0;
}
// 主函式
int main()
{
int a = 5; int b = 3;
decltype(Fun(a, b)) B;
cout << "decltype 推算後 a 和 b 的值:\t a=" << a << ", b=" << b << endl;
auto A = Fun(a, b);
cout << "auto 推算後 a 和 b 的值:\t a=" << a << ", b=" << b << endl;
return 0;
}
除錯結果:
可以看到,decltype 是不會去執行 Fun 函式的,它就只會做型別的推算
4._End
苦做舟
本文來自部落格園,作者:拾荒荒,轉載請註明原文連結:https://www.cnblogs.com/lvvou/p/15684727.html