c++ decltype
生活随笔
收集整理的這篇文章主要介紹了
c++ decltype
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
decltype 是 C++11 新增的一個關鍵字,它和 auto 的功能一樣,都用來在編譯時期進行自動類型推導。不了解 auto 用法的讀者請轉到《C++ auto》。
auto 和 decltype 關鍵字都可以自動推導出變量的類型,但它們的用法是有區別的:
auto 根據=右邊的初始值 value 推導出變量的類型,而 decltype 根據 exp 表達式推導出變量的類型,跟=右邊的 value 沒有關系。
另外,auto 要求變量必須初始化,而 decltype 不要求。這很容易理解,auto 是根據變量的初始值來推導出變量類型的,如果不初始化,變量的類型也就無法推導了。decltype 可以寫成下面的形式:
C++ decltype 用法舉例: 復制純文本復制int a = 0; decltype(a) b = 1; //b 被推導成了 int decltype(10.8) x = 5.5; //x 被推導成了 double decltype(x + 100) y; //y 被推導成了 double int a = 0;
decltype(a) b = 1; //b 被推導成了 int
decltype(10.8) x = 5.5; //x 被推導成了 double
decltype(x + 100) y; //y 被推導成了 double 可以看到,decltype 能夠根據變量、字面量、帶有運算符的表達式推導出變量的類型。讀者請留意第 4 行,y 沒有被初始化。
為了更好地理解 decltype 的推導規則,下面來看幾個實際的例子。
#include <string> using namespace std; class Student{ public:static int total;string name;int age;float scores; }; int Student::total = 0; int main(){int n = 0;const int &r = n;Student stu;decltype(n) a = n; //n 為 int 類型,a 被推導為 int 類型decltype(r) b = n; //r 為 const int& 類型, b 被推導為 const int& 類型decltype(Student::total) c = 0; //total 為類 Student 的一個 int 類型的成員變量,c 被推導為 int 類型decltype(stu.name) url = "http://c.biancheng.net/cplus/"; //total 為類 Student 的一個 string 類型的成員變量, url 被推導為 string 類型return 0; } using namespace std; class Base{ public:int x; }; int main(){const Base obj;//帶有括號的表達式decltype(obj.x) a = 0; //obj.x 為類的成員訪問表達式,符合推導規則一,a 的類型為 intdecltype((obj.x)) b = a; //obj.x 帶有括號,符合推導規則三,b 的類型為 int&。//加法表達式int n = 0, m = 0;decltype(n + m) c = 0; //n+m 得到一個右值,符合推導規則一,所以推導結果為 intdecltype(n = n + m) d = c; //n=n+m 得到一個左值,符號推導規則三,所以推導結果為 int&return 0; }
decltype 是“declare type”的縮寫,譯為“聲明類型”。
既然已經有了 auto 關鍵字,為什么還需要 decltype 關鍵字呢?因為 auto 并不適用于所有的自動類型推導場景,在某些特殊情況下 auto 用起來非常不方便,甚至壓根無法使用,所以 decltype 關鍵字也被引入到 C++11 中。auto 和 decltype 關鍵字都可以自動推導出變量的類型,但它們的用法是有區別的:
auto varname = value;
decltype(exp) varname = value;
auto 根據=右邊的初始值 value 推導出變量的類型,而 decltype 根據 exp 表達式推導出變量的類型,跟=右邊的 value 沒有關系。
另外,auto 要求變量必須初始化,而 decltype 不要求。這很容易理解,auto 是根據變量的初始值來推導出變量類型的,如果不初始化,變量的類型也就無法推導了。decltype 可以寫成下面的形式:
decltype(exp) varname;
exp 注意事項
原則上講,exp 就是一個普通的表達式,它可以是任意復雜的形式,但是我們必須要保證 exp 的結果是有類型的,不能是 void;例如,當 exp 調用一個返回值類型為 void 的函數時,exp 的結果也是 void 類型,此時就會導致編譯錯誤。C++ decltype 用法舉例: 復制純文本復制
decltype 推導規則
上面的例子讓我們初步感受了一下 decltype 的用法,但你不要認為 decltype 就這么簡單,它的玩法實際上可以非常復雜。當程序員使用 decltype(exp) 獲取類型時,編譯器將根據以下三條規則得出結果:- 如果 exp 是一個不被括號( )包圍的表達式,或者是一個類成員訪問表達式,或者是一個單獨的變量,那么 decltype(exp) 的類型就和 exp 一致,這是最普遍最常見的情況。
- 如果 exp 是函數調用,那么 decltype(exp) 的類型就和函數返回值的類型一致。
- 如果 exp 是一個左值,或者被括號( )包圍,那么 decltype(exp) 的類型就是 exp 的引用;假設 exp 的類型為 T,那么 decltype(exp) 的類型就是 T&。
為了更好地理解 decltype 的推導規則,下面來看幾個實際的例子。
#include <string> using namespace std; class Student{ public:static int total;string name;int age;float scores; }; int Student::total = 0; int main(){int n = 0;const int &r = n;Student stu;decltype(n) a = n; //n 為 int 類型,a 被推導為 int 類型decltype(r) b = n; //r 為 const int& 類型, b 被推導為 const int& 類型decltype(Student::total) c = 0; //total 為類 Student 的一個 int 類型的成員變量,c 被推導為 int 類型decltype(stu.name) url = "http://c.biancheng.net/cplus/"; //total 為類 Student 的一個 string 類型的成員變量, url 被推導為 string 類型return 0; } using namespace std; class Base{ public:int x; }; int main(){const Base obj;//帶有括號的表達式decltype(obj.x) a = 0; //obj.x 為類的成員訪問表達式,符合推導規則一,a 的類型為 intdecltype((obj.x)) b = a; //obj.x 帶有括號,符合推導規則三,b 的類型為 int&。//加法表達式int n = 0, m = 0;decltype(n + m) c = 0; //n+m 得到一個右值,符合推導規則一,所以推導結果為 intdecltype(n = n + m) d = c; //n=n+m 得到一個左值,符號推導規則三,所以推導結果為 int&return 0; }
總結
以上是生活随笔為你收集整理的c++ decltype的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 再谈编程范式-程序语言背后的思想
- 下一篇: 64位操作系统的原理