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

更新於: 2020年2月11日

901 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告