自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C++11新特性:關(guān)于auto:{int i = 8; int& j = i; auto m = j;}請(qǐng)問m是什么類型?

開發(fā) 前端
從C++11開始,auto的語(yǔ)義被完全改變,成為了一種類型推導(dǎo)機(jī)制。它允許編譯器根據(jù)初始化表達(dá)式的類型自動(dòng)推斷變量的類型。這使得代碼更加簡(jiǎn)潔,尤其是在處理復(fù)雜類型(如模板或迭代器)時(shí)。

auto其實(shí)不算一個(gè)新的關(guān)鍵字,只不過(guò)它的老的含義現(xiàn)在已經(jīng)失去了意義。

舊版 auto 的含義

在C語(yǔ)言和C++98/C++03標(biāo)準(zhǔn)中,auto是一個(gè)存儲(chǔ)類別說(shuō)明符,用于顯式地聲明一個(gè)變量具有自動(dòng)存儲(chǔ)期。這意味著變量是在進(jìn)入其作用域時(shí)創(chuàng)建,并在離開該作用域時(shí)銷毀。這是大多數(shù)局部變量默認(rèn)的行為,因此很少有人會(huì)顯式地使用auto來(lái)聲明變量,因?yàn)樗鼛缀蹩偸嵌嘤嗟摹?/span>

例如:

void function() {
    auto int x = 10; // 自動(dòng)存儲(chǔ)期,實(shí)際上等價(jià)于 int x = 10;
    // ...
}

在這個(gè)例子中,x 是一個(gè)具有自動(dòng)存儲(chǔ)期的局部變量。但是,因?yàn)樗芯植孔兞磕J(rèn)都是自動(dòng)存儲(chǔ)期的,所以這里的auto關(guān)鍵字是可選且冗余的。

C++11 及以后版本中的 auto

從C++11開始,auto的語(yǔ)義被完全改變,成為了一種類型推導(dǎo)機(jī)制。它允許編譯器根據(jù)初始化表達(dá)式的類型自動(dòng)推斷變量的類型。這使得代碼更加簡(jiǎn)潔,尤其是在處理復(fù)雜類型(如模板或迭代器)時(shí)。

例如:

std::vector<int> vec = {1, 2, 3};
for (auto it = vec.begin(); it != vec.end(); ++it) {
    std::cout << *it << " ";
}

在這里,auto讓編譯器推斷出it的類型應(yīng)該是std::vector<int>::iterator,從而避免了顯式寫出這個(gè)較長(zhǎng)的類型名。

我們?cè)倏搭}目中提到的問題:

int i = 8;
int& j = i;
auto m = j;

j是 int& 類型,那么m是什么類型呢?也是int&類型嗎?

答案是:m在這里是int類型而不是int& 引用類型。

auto不會(huì)保留引用特性。也就是說(shuō),auto會(huì)將j解引用,得到它所指向的實(shí)際對(duì)象的類型。

我們代碼實(shí)際操作驗(yàn)證一下:

圖片

修改后再實(shí)驗(yàn):

圖片

輸出還是int類型,這是怎么回事呢?

typeid(decltype(m)).name() 返回的類型名可能不是特別直觀,因?yàn)樗蕾囉诰幾g器的具體實(shí)現(xiàn)。不同的編譯器可能會(huì)以不同的格式返回類型名。例如,在某些編譯器中,int 類型可能顯示為 i,引用類型可能帶有額外的修飾符(如 R 表示引用)。如果需要更可讀的輸出,可能需要自己解析這些符號(hào),或者僅在調(diào)試和開發(fā)過(guò)程中使用它們。

為了更明確地確認(rèn) m 的類型是否為 int&,可以使用類型特征(type traits)來(lái)檢查。例如:

int i = 8;
    int& j = i;
    auto m = j;
    std::cout << "Type: " << typeid(decltype(j)).name() << std::endl;


    if (std::is_same<decltype(m), int&>::value) {
        std::cout << "m is of type int&" << std::endl;
    }
    else {
        std::cout << "m is not of type int&" << std::endl;
    }

運(yùn)行:

圖片

修改后:

int i = 8;
    int& j = i;
    auto& m = j;
    std::cout << "Type: " << typeid(decltype(j)).name() << std::endl;


    if (std::is_same<decltype(m), int&>::value) {
        std::cout << "m is of type int&" << std::endl;
    }
    else {
        std::cout << "m is not of type int&" << std::endl;
    }

輸出:

圖片圖片

這種方法可以在編譯時(shí)進(jìn)行類型檢查,并且不會(huì)依賴于編譯器的具體實(shí)現(xiàn)。

通過(guò)上面的測(cè)試可以得到:不加引用,m在這里是int類型而不是int& 引用類型,auto不會(huì)保留引用特性。

還有同樣的 auto也不會(huì)保留const特性。

int main() 
{
    const int i = 9;
    auto j = i;




    if (std::is_same<decltype(j),  const int>::value) {
        std::cout << "j is of type const int" << std::endl;
    }
    else {
        std::cout << "j is not of type const int" << std::endl;
    }




    return 0;
}

運(yùn)行輸出:

圖片圖片

總結(jié):

auto不會(huì)保留引用特性。

auto不會(huì)保留const特性。

責(zé)任編輯:武曉燕 來(lái)源: CppPlayer
相關(guān)推薦

2023-09-22 22:27:54

autoC++11

2023-09-24 13:58:20

C++1auto

2012-12-25 10:52:23

IBMdW

2013-12-11 10:00:14

C++新特性C

2012-02-15 09:36:50

C++ 11

2011-05-27 10:58:33

筆記本評(píng)測(cè)

2012-04-20 12:42:21

2016-05-20 00:55:59

谷歌IO大會(huì)

2012-04-10 17:47:55

Alienware筆記本

2011-05-06 17:25:35

筆記本聯(lián)想ThinkPad

2012-08-08 12:46:48

筆記本

2011-05-05 10:35:18

筆記本Alienware M

2012-08-03 13:42:26

筆記本

2011-11-10 09:35:12

聯(lián)想臺(tái)式機(jī)

2011-11-17 13:47:44

聯(lián)想臺(tái)式機(jī)

2020-07-27 10:40:35

C++11語(yǔ)言代碼

2012-10-15 19:48:06

聯(lián)想M490

2011-05-06 16:47:13

筆記本聯(lián)想ThinkPad

2011-11-07 09:42:58

蘋果臺(tái)式機(jī)

2009-06-19 16:39:54

J2EEJ2SEJ2ME
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)