C++ 中 auto 和 decltype 之間的關係是什麼?
auto 和 decltype 具有不同的用途,因此它們之間沒有一一對應關係。auto 是 C++11 及更高版本中的一個關鍵字,用於自動型別推導。decltype 型別說明符會生成指定表示式的型別。與根據分配給變數的值推導型別的 auto 不同,decltype 從傳遞給它的表示式推導型別。decltype 返回的值可以直接用於定義另一個變數。
auto 遵循模板引數推導規則。您可以在 https://cppreference.tw/w/cpp/language/template_argument_deduction 上閱讀更多關於這些規則的資訊。
雖然 decltype 有一些標準中定義的規則需要遵循。以下是標準中包含這些規則的摘錄
與 sizeof 運算子類似,decltype 的運算元不會被求值。非正式地,decltype(e) 返回的型別如下推導:
- 如果表示式 e 指的是區域性或名稱空間範圍內的變數、靜態成員變數或函式引數,則結果是該變數或引數的宣告型別
- 如果 e 是函式呼叫或過載運算子呼叫,則 decltype(e) 表示該函式的宣告返回型別
- 否則,如果 e 是左值,則 decltype(e) 是 T&,其中 T 是 e 的型別;如果 e 是右值,則結果是 T
這些語義旨在滿足通用庫編寫者的需求,同時對於新手程式設計師來說也很直觀,因為 decltype 的返回型別始終與原始碼中宣告的物件或函式的型別完全匹配。更正式地說,規則 1 應用於未加括號的 id-表示式和類成員訪問表示式。對於函式呼叫,推匯出的型別是靜態選擇的函式的返回型別,由過載解析規則確定。
示例
使用 auto 和 decltype 的示例:
#include<iostream> #include<vector> using namespace std; int main() { // Using auto for type deduction vector<int> arr(10); for(auto it = arr.begin(); it != arr.end(); it ++) { cin >> *it; } // Using decltype for type deduction vector<int> arr(10); for (decltype(arr.begin()) it = arr.begin(); it != arr.end(); it++) { cin >> *it; } return 0; }
請注意,decltype 表示的型別可能與 auto 推匯出的型別不同。您可以在這份關於 C++ 中型別推導的 12 頁解釋中閱讀更多關於這些細微差別的資訊:http://thbecker.net/articles/auto_and_decltype/section_01.html
廣告