成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

舊版 auto 的含義

在C語言和C++98/C++03標準中,auto是一個存儲類別說明符,用于顯式地聲明一個變量具有自動存儲期。這意味著變量是在進入其作用域時創(chuàng)建,并在離開該作用域時銷毀。這是大多數(shù)局部變量默認的行為,因此很少有人會顯式地使用auto來聲明變量,因為它幾乎總是多余的。

例如:

void function() {
    auto int x = 10; // 自動存儲期,實際上等價于 int x = 10;
    // ...
}

在這個例子中,x 是一個具有自動存儲期的局部變量。但是,因為所有局部變量默認都是自動存儲期的,所以這里的auto關(guān)鍵字是可選且冗余的。

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

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

例如:

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

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

我們再看題目中提到的問題:

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

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

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

auto不會保留引用特性。也就是說,auto會將j解引用,得到它所指向的實際對象的類型。

我們代碼實際操作驗證一下:

圖片

修改后再實驗:

圖片

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

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

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

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;
    }

運行:

圖片

修改后:

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;
    }

輸出:

圖片圖片

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

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

還有同樣的 auto也不會保留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;
}

運行輸出:

圖片圖片

總結(jié):

auto不會保留引用特性。

auto不會保留const特性。

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

2023-09-22 22:27:54

autoC++11

2012-12-25 10:52:23

IBMdW

2013-12-11 10:00:14

C++新特性C

2023-09-24 13:58:20

C++1auto

2012-02-15 09:36:50

C++ 11

2012-04-20 12:42:21

2011-05-27 10:58:33

筆記本評測

2012-04-10 17:47:55

Alienware筆記本

2016-05-20 00:55:59

谷歌IO大會

2011-05-06 17:25:35

筆記本聯(lián)想ThinkPad

2012-08-08 12:46:48

筆記本

2025-06-23 02:00:00

2011-05-05 10:35:18

筆記本Alienware M

2011-11-17 13:47:44

聯(lián)想臺式機

2011-11-10 09:35:12

聯(lián)想臺式機

2012-08-03 13:42:26

筆記本

2020-07-27 10:40:35

C++11語言代碼

2011-05-06 16:47:13

筆記本聯(lián)想ThinkPad

2012-10-15 19:48:06

聯(lián)想M490

2011-11-07 09:42:58

蘋果臺式機
點贊
收藏

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

主站蜘蛛池模板: 天堂在线免费视频 | 影音先锋男 | 国产伦一区二区三区 | 国产一级在线 | 午夜免费小视频 | 韩日精品在线观看 | 91久久精品日日躁夜夜躁国产 | 一区二区三区国产 | 国产一区二区电影网 | 男女激情网站免费 | 波多野结衣一区二区三区 | 中文久久| 色吧综合 | 日韩不卡视频在线观看 | 国产二区视频 | 亚洲第一在线视频 | 日本一区二区三区免费观看 | 久久精品网 | 999久久 | 国产精品久久欧美久久一区 | 91嫩草精品 | 国产男女视频 | 四色成人av永久网址 | 国产视频第一页 | 久久国产成人 | 黑人精品欧美一区二区蜜桃 | 国产精久久久久久久 | 亚洲精品一区二区 | 亚洲永久精品国产 | 欧美精品福利视频 | 五月婷六月丁香 | 在线色网| 伊人激情网 | 亚洲视频第一页 | 天天色官网| 福利视频一二区 | 91视频网址 | 激情五月婷婷综合 | 亚洲精品乱 | 99久久99 | 中文字幕日韩欧美一区二区三区 |