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

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

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

auto其實不算一個新的關鍵字,只不過它的老的含義現在已經失去了意義。

舊版 auto 的含義

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

例如:

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

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

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

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

例如:

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

為了更明確地確認 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;
    }

輸出:

圖片圖片

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

通過上面的測試可以得到:不加引用,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;
}

運行輸出:

圖片圖片

總結:

auto不會保留引用特性。

auto不會保留const特性。

責任編輯:武曉燕 來源: CppPlayer
相關推薦

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筆記本

2011-05-06 17:25:35

筆記本聯想ThinkPad

2016-05-20 00:55:59

谷歌IO大會

2025-06-23 02:00:00

2012-08-08 12:46:48

筆記本

2011-05-05 10:35:18

筆記本Alienware M

2012-08-03 13:42:26

筆記本

2011-11-17 13:47:44

聯想臺式機

2011-11-10 09:35:12

聯想臺式機

2020-07-27 10:40:35

C++11語言代碼

2012-10-15 19:48:06

聯想M490

2011-05-06 16:47:13

筆記本聯想ThinkPad

2011-11-07 09:42:58

蘋果臺式機
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 少妇特黄a一区二区三区88av | av福利网 | 日韩精品一 | 亚洲一区二区三区四区五区中文 | 伊人久久大香线 | 久久久国产精品视频 | 国产情侣久久 | 日本爱爱视频 | 久久精品视频网站 | 波多野结衣精品在线 | 精品福利在线 | 超碰在线97国产 | 日本久久综合网 | 国产一区2区 | 在线免费观看黄色 | 国产一级大片 | 亚洲视频区 | 国产一级毛片精品完整视频版 | 91久久久久久久久久久 | 国产精品69av| 国产精品中文字幕一区二区三区 | 国产小视频在线 | 国产一区二区视频在线观看 | 影音先锋中文字幕在线观看 | 亚洲一区二区三区免费在线观看 | 五月婷婷在线视频 | 欧美激情99 | 国产欧美精品一区二区色综合朱莉 | 精品欧美激情在线观看 | 黄色成人免费在线观看 | 国产91久久精品一区二区 | 国产伦一区二区三区 | 国产精品久久久爽爽爽麻豆色哟哟 | 久久福利 | 作爱视频免费看 | 亚洲网站免费看 | a在线免费观看视频 | 国产综合精品一区二区三区 | 国产亚洲精品综合一区 | 欧美成人在线免费 | 亚洲精品久久久久久国产精华液 |