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

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

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

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

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

auto 是一個(gè)用于自動(dòng)類型推導(dǎo)的關(guān)鍵字。它主要用于變量聲明,讓編譯器根據(jù)變量的初始化表達(dá)式來(lái)推導(dǎo)出變量的類型。

1.1、基本用法

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

1.2、優(yōu)勢(shì)

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

1.3、 注意事項(xiàng)

  • 必須初始化: auto 變量必須在聲明時(shí)初始化,否則編譯器無(wú)法推導(dǎo)類型。
  • 引用和常量性: auto 會(huì)忽略初始化表達(dá)式的引用和頂層 const(指對(duì)象本身是 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 推導(dǎo)數(shù)組類型會(huì)得到指針類型,推導(dǎo)函數(shù)類型也會(huì)得到函數(shù)指針類型。

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

1.4、 auto 的高級(jí)用法

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

int  x = 0;
auto *p1 = &x;   //p1 為 int *,auto 推導(dǎo)為 int
auto  p2 = &x;   //p2 為 int*,auto 推導(dǎo)為 int*
auto &r1  = x;   //r1 為 int&,auto 推導(dǎo)為 int
auto r2 = r1;    //r2 為  int,auto 推導(dǎo)為 int

auto和const結(jié)合:

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

1.4、 auto 的限制

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

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

decltype 用于查詢表達(dá)式的類型。它不會(huì)計(jì)算表達(dá)式的值,只是分析表達(dá)式并返回其類型。

2.1、基本用法

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

2.2、核心規(guī)則

  • decltype 的行為取決于傳遞給它的表達(dá)式:
  • 表達(dá)式是未加括號(hào)的變量 (如 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

表達(dá)式是加括號(hào)的變量 (如 decltype((x))):

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

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

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

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

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

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

C++14 引入了 decltype(auto),它結(jié)合了兩者的意圖:用于變量聲明(像 auto),但使用 decltype 的規(guī)則進(jìn)行推導(dǎo)(保留引用和 const)。它相當(dāng)于對(duì)初始化表達(dá)式應(yīng)用 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& (應(yīng)用 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) 在需要精確轉(zhuǎn)發(fā)返回類型(如在轉(zhuǎn)發(fā)函數(shù)或通用 Lambda 中)時(shí)特別有用。

二、示例

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

#include <iostream>
#include <vector>
#include <typeinfo> // 用于打印類型信息(僅作演示,非必需)
int main() {
    // 示例 1: 使用 auto 推導(dǎo)變量類型
    auto x = 42; // 編譯器推導(dǎo) x 為 int 類型
    auto y = 3.14; // 編譯器推導(dǎo) y 為 double 類型
    auto vec = std::vector<int>{1, 2, 3}; // 編譯器推導(dǎo) vec 為 std::vector<int> 類型
    // 示例 2: 使用 decltype 獲取表達(dá)式的類型
    decltype(x) a = x; // a 的類型與 x 相同 (int)
    decltype(3.14 + 1) b; // b 的類型是 3.14(double) + 1(int) 的結(jié)果類型 (double)
    decltype(vec[0]) element = vec[0]; // element 的類型是 vector 元素類型 (int&)
    // 示例 3: auto 在范圍 for 循環(huán)中的應(yīng)用
    std::cout << "Vector elements: ";
    for (auto num : vec) { // num 的類型被推導(dǎo)為 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;
}

運(yùn)行結(jié)果:

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 (進(jìn)程 34504)已退出,代碼為 0 (0x0)。
要在調(diào)試停止時(shí)自動(dòng)關(guān)閉控制臺(tái),請(qǐng)啟用“工具”->“選項(xiàng)”->“調(diào)試”->“調(diào)試停止時(shí)自動(dòng)關(guān)閉控制臺(tái)”。
按任意鍵關(guān)閉此窗口. . .

代碼說明:

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

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

相關(guān)文章

  • pthread_cond_wait() 用法深入分析

    pthread_cond_wait() 用法深入分析

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

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

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

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

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

    c語(yǔ)言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)

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

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

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

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

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

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的圖書管理系統(tǒng)

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

    C++單例設(shè)計(jì)模式詳細(xì)講解

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

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單三子棋游戲

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

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單五子棋小游戲

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

最新評(píng)論

吴江市| 合川市| 葫芦岛市| 武强县| 高邮市| 铜川市| 江西省| 泌阳县| 营山县| 邛崃市| 黄龙县| 拉萨市| 收藏| 琼中| 梓潼县| 兴仁县| 民乐县| 旅游| 芦山县| 湘潭市| 崇左市| 邵武市| 兰考县| 东宁县| 阿图什市| 根河市| 佛坪县| 阳新县| 饶阳县| 大关县| 宁阳县| 麻阳| 读书| 清新县| 怀仁县| 美姑县| 双辽市| 阿克陶县| 宽城| 洪雅县| 杭锦旗|