[C++] C ++自動關鍵字。 為什麼它是魔術?


Answers

這只是一個通常無用的關鍵字,並給它一個新的,更好的功能。 它在C ++ 11中是標準的,大多數C ++編譯器甚至支持一些C ++ 11支持。

Question

從我用來學習C ++的所有材料中, auto一直是一個奇怪的存儲時長說明符,它不起任何作用。 但是就在最近,我遇到了將其用作類型名稱的代碼。 出於好奇,我嘗試了它,並假設我碰巧指派給它的類型!

突然之間STL迭代器,以及任何使用模板的東西都可以輕鬆地寫出10倍。 感覺就像我在使用Python這樣的“有趣”語言。

這個關鍵字在哪裡一直是我的一生? 通過說它是視覺工作室獨有的或不可移動的,你會沖我的夢想嗎?




對於變量,指定正在聲明的變量的類型將從其初始化程序中自動推斷出來。 對於函數,指定返回類型是尾隨返回類型,或者將從其返回語句(自C ++ 14開始)推導出來。

句法

auto variable initializer   (1) (since C++11)

auto function -> return type    (2) (since C++11)

auto function   (3) (since C++14)

decltype(auto) variable initializer (4) (since C++14)

decltype(auto) function (5) (since C++14)

auto :: (6) (concepts TS)

cv(optional) auto ref(optional) parameter   (7) (since C++14)

說明

1)在塊範圍,命名空間範圍,for循環的初始化語句等中聲明變量時,可以使用關鍵字auto作為類型說明符。 一旦確定了初始化程序的類型,編譯器就會使用從函數調用(參見模板參數推導#其他上下文獲取詳細信息)中的模板參數推導規則來確定將替換關鍵字auto的類型。 關鍵字auto可能伴隨有修飾符,如const或&,它們將參與類型推導。 例如,給定const auto& i = expr; ,如果編譯函數調用f(expr) ,那麼i的類型就是虛構模板template<class U> void f(const U& u)中的參數u的類型。 template<class U> void f(const U& u) 因此,根據初始值設定項,可以將auto &&推導為左值參考值或右值參考值,該值用於基於範圍的循環中。 如果使用auto來聲明多個變量,則推導出的類型必須匹配。 例如,聲明auto i = 0, d = 0.0; 是不合格的,而聲明auto i = 0, *p = &i; 格式良好,自動推導為int。

2)在使用尾部返回類型語法的函數聲明中,關鍵字auto不執行自動類型檢測。 它僅作為語法的一部分。

3)在不使用尾部返回類型語法的函數聲明中,關鍵字auto表示返回類型將使用模板參數推導的規則從其返回語句的操作數中推導出來。

4)如果變量的聲明類型是decltype(auto),則關鍵字auto用其初始值設定項的表達式(或表達式列表)替換,實際類型使用decltype的規則推導出來。

5)如果函數的返回類型被聲明為decltype(auto),則關鍵字auto將被其return語句的操作數替換,並且實際返回類型將使用decltype的規則推導出來。

6)形式為auto ::的嵌套名稱說明符是一個佔位符,它由遵循約束類型占位符扣除規則的類或枚舉類型替換。

7)lambda表達式中的參數聲明。 (自C ++ 14以來)函數參數聲明。 (概念TS)

備註在C ++ 11之前,auto具有存儲持續時間說明符的語義。 在一個聲明中混合自動變量和函數,如在auto f() -> int, i = 0; 不允許。

欲了解更多信息: en.cppreference.com/w/cpp/language/autoen.cppreference.com/w/cpp/language/auto




Links