最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ auto和decltype的用法和區(qū)別全解析

 更新時間:2026年01月22日 11:38:35   作者:小灰灰搞電子  
這篇文章介紹了C++11和C++14中auto和decltype關鍵字的用法和區(qū)別,auto用于自動類型推導,適用于變量聲明,簡化代碼并提高可維護性,decltype用于查詢表達式的類型,保留表達式的完整類型信息,感興趣的朋友跟隨小編一起看看吧

一、auto和decltype的用法和區(qū)別

1、auto關鍵字 (C++11 引入)

auto 是一個用于自動類型推導的關鍵字。它主要用于變量聲明,讓編譯器根據(jù)變量的初始化表達式來推導出變量的類型。

1.1、基本用法

auto x = 42;       // x 的類型被推導為 int
auto y = 3.14;     // y 的類型被推導為 double
auto str = "hello"; // str 的類型被推導為 const char*

1.2、優(yōu)勢

  • 簡化代碼: 特別適用于類型名稱冗長復雜的情況(如迭代器、Lambda 表達式)。
std::vector<std::map<std::string, int>> complexVector;
// 不用寫復雜的迭代器類型
for (auto it = complexVector.begin(); it != complexVector.end(); ++it) {
    // ...
}
  • 提高可維護性: 如果初始化表達式的類型改變(例如函數(shù)返回類型改變),使用 auto 的變量類型會自動隨之改變,無需修改多處代碼。
  • 通用性: 在模板編程中,有時無法預先知道具體類型,auto 可以用于推導依賴模板參數(shù)的類型。
template <typename T, typename U>
auto add(T t, U u) -> decltype(t + u) { // 函數(shù)返回類型也可以用 auto + 尾置返回類型 (C++11)
    return t + u;
}

1.3、 注意事項

  • 必須初始化: auto 變量必須在聲明時初始化,否則編譯器無法推導類型。
  • 引用和常量性: auto忽略初始化表達式的引用和頂層 const(指對象本身是 const)。
int i = 10;
const int ci = 20;
int& ref_i = i;
const int& cref_i = ci;
auto a = ci;    // a 是 int (頂層 const 被忽略)
auto b = ref_i; // b 是 int (引用被忽略)
auto c = cref_i; // c 是 int (引用和頂層 const 被忽略)
a = 30; // 合法
b = 40; // 合法
// 如果需要保留引用或 const,需要顯式加上
auto& d = ref_i; // d 是 int&
const auto e = ci; // e 是 const int

數(shù)組和函數(shù)指針: auto 推導數(shù)組類型會得到指針類型,推導函數(shù)類型也會得到函數(shù)指針類型。

int arr[5] = {1, 2, 3, 4, 5};
auto p = arr; // p 的類型是 int*
void func();
auto pf = func; // pf 的類型是 void (*)()

1.4、 auto 的高級用法

auto 除了可以獨立使用,還可以和某些具體類型混合使用,這樣 auto 表示的就是“半個”類型,而不是完整的類型。請看下面的代碼:

int  x = 0;
auto *p1 = &x;   //p1 為 int *,auto 推導為 int
auto  p2 = &x;   //p2 為 int*,auto 推導為 int*
auto &r1  = x;   //r1 為 int&,auto 推導為 int
auto r2 = r1;    //r2 為  int,auto 推導為 int

auto和const結合:

int  x = 0;
const  auto n = x;  //n 為 const int ,auto 被推導為 int
auto f = n;      //f 為 const int,auto 被推導為 int(const 屬性被拋棄)
const auto &r1 = x;  //r1 為 const int& 類型,auto 被推導為 int
auto &r2 = r1;  //r1 為 const int& 類型,auto 被推導為 const int 類型`在這里插入代碼片`

1.4、 auto 的限制

  • auto 不能在函數(shù)的參數(shù)中使用
  • auto 不能作用于類的非靜態(tài)成員變量(也就是沒有 static 關鍵字修飾的成員變量)中。
  • auto 關鍵字不能定義數(shù)組,比如下面的例子就是錯誤的:
char url[] = “http://c.biancheng.net/”;
auto str[] = url; //arr 為數(shù)組,所以不能使用 auto
  • 多個變量聲明時類型必須一致。
  • auto 不能作用于模板參數(shù),請看下面的例子:
template <typename T>
class A{
    //TODO:
};
int  main(){
    A<int> C1;
    A<auto> C2 = C1;  //錯誤
    return 0;
}

2、decltype關鍵字 (C++11 引入)

decltype 用于查詢表達式的類型。它不會計算表達式的值,只是分析表達式并返回其類型。

2.1、基本用法

int i = 42;
decltype(i) di; // di 的類型是 int
double d = 3.14;
decltype(d) dd = d; // dd 的類型是 double

2.2、核心規(guī)則

  • decltype 的行為取決于傳遞給它的表達式:
  • 表達式是未加括號的變量 (如 decltype(x)):
int i = 0;
int& ref_i = i;
const int ci = 1;
const int& cref_i = ci;
decltype(ref_i) dr = i;   // dr 是 int&
decltype(ci) dc = 2;      // dc 是 const int
decltype(cref_i) dcr = ci; // dcr 是 const int&

返回該變量的聲明類型,包括其引用和頂層 const。

表達式是加括號的變量 (如 decltype((x))):

int i = 0;
decltype((i)) di = i; // di 是 int&
decltype((5)) d5 = 5; // d5 是 int&& (5 是右值)
  • 返回該變量的引用類型。如果變量本身是左值,則返回左值引用 (T&),如果變量是右值,則返回右值引用 (T&&)。這是一種特殊情況。
  • 表達式是其他類型(函數(shù)調(diào)用、運算符表達式等):
int i = 0;
int* p = &i;
decltype(*p) d = i; // *p 是左值表達式,d 是 int&
decltype(i + 1) di = i; // i+1 是右值表達式,di 是 int
decltype(++i) di_inc = i; // ++i 是左值表達式 (返回 i 的引用),di_inc 是 int&
decltype(i++) di_post; // i++ 是右值表達式 (返回舊值的副本),di_post 是 int
  • 返回該表達式計算結果對應的類型。如果表達式產(chǎn)生左值,則返回左值引用 (T&),如果產(chǎn)生右值,則返回非引用類型 (T)。這與 decltype((x)) 類似。

2.3、優(yōu)勢與用途

  • 精確獲取類型: 保留表達式的完整類型信息,包括引用和 const 限定符。這是它與 auto 的關鍵區(qū)別。
  • 函數(shù)返回類型推導 (C++11): 結合尾置返回類型語法,用于推導依賴模板參數(shù)的復雜返回類型。
template <typename T, typename U>
auto add(T t, U u) -> decltype(t + u) { // 推導返回類型
    return t + u;
}
  • 元編程: 在模板元編程中,需要精確知道某個表達式或類型的特性時非常有用。
  • Lambda 表達式類型: 雖然 Lambda 表達式類型是唯一的且未命名,但可以用 decltype 獲取其類型(雖然通常更常用 autostd::function)。
auto lambda = []{ return 42; };
decltype(lambda) anotherLambda = lambda; // anotherLambda 是同類型 Lambda

3、auto和decltype的區(qū)別總結

特性autodecltype
主要用途聲明變量,根據(jù)初始化器推導類型查詢表達式的類型
初始化要求必須初始化不需要初始化 (只是查詢類型)
引用處理忽略初始化表達式的引用保留表達式的引用信息
頂層 const處理忽略初始化表達式的頂層 const保留表達式的頂層 const
括號影響不受括號影響 (auto x = (y);auto x = y; 相同)decltype((x))decltype(x) 行為不同
推導來源基于初始化表達式的 (忽略引用/const)基于表達式的類型和值類別
常見場景簡化變量聲明、迭代器、Lambda精確類型獲取、尾置返回類型、元編程

4、decltype(auto)(C++14 引入)

C++14 引入了 decltype(auto),它結合了兩者的意圖:用于變量聲明(像 auto),但使用 decltype 的規(guī)則進行推導(保留引用和 const)。它相當于對初始化表達式應用 decltype 規(guī)則。

int i = 0;
int& ref_i = i;
const int ci = 1;
const int& cref_i = ci;
auto a = ref_i;        // a 是 int
decltype(auto) da = ref_i; // da 是 int& (應用 decltype 規(guī)則)
auto b = cref_i;       // b 是 int
decltype(auto) db = cref_i; // db 是 const int&
auto c = 5;            // c 是 int
decltype(auto) dc = 5; // dc 是 int (5 是右值)

decltype(auto) 在需要精確轉發(fā)返回類型(如在轉發(fā)函數(shù)或通用 Lambda 中)時特別有用。

二、示例

好的,這是一個展示 C++ 中 autodecltype 用法的示例:

#include <iostream>
#include <vector>
#include <typeinfo> // 用于打印類型信息(僅作演示,非必需)
int main() {
    // 示例 1: 使用 auto 推導變量類型
    auto x = 42; // 編譯器推導 x 為 int 類型
    auto y = 3.14; // 編譯器推導 y 為 double 類型
    auto vec = std::vector<int>{1, 2, 3}; // 編譯器推導 vec 為 std::vector<int> 類型
    // 示例 2: 使用 decltype 獲取表達式的類型
    decltype(x) a = x; // a 的類型與 x 相同 (int)
    decltype(3.14 + 1) b; // b 的類型是 3.14(double) + 1(int) 的結果類型 (double)
    decltype(vec[0]) element = vec[0]; // element 的類型是 vector 元素類型 (int&)
    // 示例 3: auto 在范圍 for 循環(huán)中的應用
    std::cout << "Vector elements: ";
    for (auto num : vec) { // num 的類型被推導為 int (vec 的元素類型)
        std::cout << num << " ";
    }
    std::cout << std::endl;
    // 示例 4: decltype 用于函數(shù)返回類型(后置返回類型)
    auto add = [](int a, int b) -> decltype(a + b) {
        return a + b;
    };
    auto sum = add(x, 10); // sum 的類型是 decltype(a + b),即 int
    // (可選) 打印一些變量的類型信息 (需要 typeid)
    std::cout << "Type of x: " << typeid(x).name() << std::endl;
    std::cout << "Type of y: " << typeid(y).name() << std::endl;
    std::cout << "Type of a: " << typeid(a).name() << std::endl;
    std::cout << "Type of b: " << typeid(b).name() << std::endl;
    std::cout << "Type of element: " << typeid(element).name() << std::endl;
    std::cout << "Type of sum: " << typeid(sum).name() << std::endl;
    return 0;
}

運行結果:

Vector elements: 1 2 3
Type of x: int
Type of y: double
Type of a: int
Type of b: double
Type of element: int
Type of sum: int

C:\Users\徐鵬\Desktop\新建文件夾\Project1\x64\Debug\Project1.exe (進程 34504)已退出,代碼為 0 (0x0)。
要在調(diào)試停止時自動關閉控制臺,請啟用“工具”->“選項”->“調(diào)試”->“調(diào)試停止時自動關閉控制臺”。
按任意鍵關閉此窗口. . .

代碼說明:

  • auto:
    • auto x = 42;: 編譯器根據(jù)初始值 42 推導出 x 的類型為 int。
    • auto y = 3.14;: 編譯器根據(jù)初始值 3.14 推導出 y 的類型為 double
    • auto vec = std::vector<int>{1, 2, 3};: 編譯器根據(jù)初始化列表推導出 vec 的類型為 std::vector<int>。
    • for (auto num : vec): 在范圍 for 循環(huán)中,編譯器根據(jù)容器 vec 的元素類型推導出 num 的類型為 int。
    • auto add = ...: auto 用于推導匿名函數(shù) lambda 的類型。
    • auto sum = ...: auto 推導函數(shù) add 的返回類型,即 int
  • decltype:
    • decltype(x) a = x;: decltype(x) 獲取變量 x 的聲明類型 (int),因此 a 的類型也是 int。
    • decltype(3.14 + 1) b;: decltype(3.14 + 1) 計算表達式 3.14 + 1 的類型(double + int 結果為 double),因此 b 的類型是 double
    • decltype(vec[0]) element = vec[0];: decltype(vec[0]) 獲取表達式 vec[0] 的類型。對于 std::vector,operator[] 返回引用 (int&),因此 element 的類型是 int&(一個引用)。
    • -> decltype(a + b): 在 lambda 函數(shù)的后置返回類型聲明中,使用 decltype(a + b) 來指定函數(shù)的返回類型為表達式 a + b 的結果類型 (int + int = int)。
  • typeid:
    • 這部分代碼(需要包含 <typeinfo>)是可選的,僅用于在運行時打印類型名稱(如 i 表示 int, d 表示 double 等)。編譯器不同,打印的名稱格式可能不同(如 inti),這主要用于演示目的。實際編程中通常不需要這樣做。

到此這篇關于C++ auto和decltype的用法和區(qū)別全解析的文章就介紹到這了,更多相關C++ auto和decltype用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • pthread_cond_wait() 用法深入分析

    pthread_cond_wait() 用法深入分析

    以下是對pthread_cond_wait的用法進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-07-07
  • C語言深入講解動態(tài)內(nèi)存分配函數(shù)的使用

    C語言深入講解動態(tài)內(nèi)存分配函數(shù)的使用

    這篇文章主要介紹了C語言動態(tài)內(nèi)存分配,C語言內(nèi)存管理相關的函數(shù)主要有realloc、calloc、malloc、free、柔性數(shù)組等,下面這篇文章帶大家了解一下
    2022-05-05
  • C++實現(xiàn)歸并排序(MergeSort)

    C++實現(xiàn)歸并排序(MergeSort)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)歸并排序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • c語言中main函數(shù)用法及知識點總結

    c語言中main函數(shù)用法及知識點總結

    在本篇文章里小編給大家分享的是一篇關于c語言中main函數(shù)用法及知識點總結內(nèi)容,有需要的朋友們可以跟著學習參考下。
    2021-10-10
  • C++常量詳解二(常量形參,常量返回值,常量成員函數(shù))

    C++常量詳解二(常量形參,常量返回值,常量成員函數(shù))

    這篇文章主要介紹了C++常量詳解二(常量形參,常量返回值,常量成員函數(shù)),需要的朋友可以參考下
    2017-06-06
  • C++ 智能指針的魅力你都了解嗎

    C++ 智能指針的魅力你都了解嗎

    智能指針使用和普通指針類似。解引用一個智能指針返回它指向的對象。如果在一個條件判斷中使用智能指針,效果就是檢測它是否為空,本文給大家介紹C++ 智能指針的相關知識,感興趣的朋友一起看看吧
    2021-06-06
  • C語言實現(xiàn)簡單的圖書管理系統(tǒng)

    C語言實現(xiàn)簡單的圖書管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • C++單例設計模式詳細講解

    C++單例設計模式詳細講解

    單例模式(Singleton Pattern)是最簡單的設計模式之一。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式,這種模式涉及到一個單一的類,該類負責創(chuàng)建自己的對象,同時確保只有單個對象被創(chuàng)建
    2022-06-06
  • C語言實現(xiàn)簡單三子棋游戲

    C語言實現(xiàn)簡單三子棋游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單三子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C語言實現(xiàn)簡單五子棋小游戲

    C語言實現(xiàn)簡單五子棋小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單五子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08

最新評論

石台县| 鸡东县| 客服| 新巴尔虎右旗| 教育| 福鼎市| 专栏| 运城市| 酒泉市| 兴业县| 金山区| 新晃| 鹤峰县| 南宫市| 西安市| 靖西县| 临沭县| 通榆县| 莱西市| 邵阳县| 瑞金市| 霍州市| 杨浦区| 襄垣县| 太仆寺旗| 资中县| 寿阳县| 兴化市| 泌阳县| 东城区| 平安县| 汉阴县| 会泽县| 同心县| 海阳市| 滕州市| 花莲县| 宣汉县| 自治县| 岳阳市| 六枝特区|