日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ decltype

發布時間:2025/4/5 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ decltype 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
decltype 是 C++11 新增的一個關鍵字,它和 auto 的功能一樣,都用來在編譯時期進行自動類型推導。不了解 auto 用法的讀者請轉到《C++ auto》。

decltype 是“declare type”的縮寫,譯為“聲明類型”。

既然已經有了 auto 關鍵字,為什么還需要 decltype 關鍵字呢?因為 auto 并不適用于所有的自動類型推導場景,在某些特殊情況下 auto 用起來非常不方便,甚至壓根無法使用,所以 decltype 關鍵字也被引入到 C++11 中。

auto 和 decltype 關鍵字都可以自動推導出變量的類型,但它們的用法是有區別的:

auto varname = value;
decltype(exp) varname = value;

其中,varname 表示變量名,value 表示賦給變量的值,exp 表示一個表達式。

auto 根據=右邊的初始值 value 推導出變量的類型,而 decltype 根據 exp 表達式推導出變量的類型,跟=右邊的 value 沒有關系。

另外,auto 要求變量必須初始化,而 decltype 不要求。這很容易理解,auto 是根據變量的初始值來推導出變量類型的,如果不初始化,變量的類型也就無法推導了。decltype 可以寫成下面的形式:

decltype(exp) varname;

exp 注意事項

原則上講,exp 就是一個普通的表達式,它可以是任意復雜的形式,但是我們必須要保證 exp 的結果是有類型的,不能是 void;例如,當 exp 調用一個返回值類型為 void 的函數時,exp 的結果也是 void 類型,此時就會導致編譯錯誤。

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 推導規則

    上面的例子讓我們初步感受了一下 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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。