Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Mối quan hệ giữa auto và decltype trong C++?


auto và decltype phục vụ mục đích khác nhau nên không ánh xạ 1-1. auto (C++11) dùng cho suy diễn kiểu tự động. decltype cho ra kiểu của một biểu thức xác định. Khác với auto suy diễn từ giá trị gán, decltype suy diễn từ biểu thức truyền vào. Kết quả decltype có thể dùng trực tiếp định nghĩa biến khác.

auto tuân theo quy tắc suy diễn tham số template. Xem thêm tại cppreference.

decltype tuân theo quy tắc trong chuẩn. Trích đoạn:

  • Nếu biểu thức e tham chiếu đến biến cục bộ/namespace, static member, tham số hàm → kết quả là kiểu khai báo của biến/tham số đó.
  • Nếu e là lời gọi hàm hoặc toán tử nạp chồng → decltype(e) là kiểu trả về khai báo của hàm đó.
  • Nếu e là lvalue → decltype(e) là T& (T là kiểu của e); nếu rvalue → kết quả là T.

Ngữ nghĩa này thiết kế cho thư viện generic, đồng thời trực quan cho người mới vì kiểu trả về luôn khớp chính xác với khai báo trong source.

Ví dụ

#include <iostream>
#include <vector>
using namespace std;
int main() {
    // auto
    vector<int> arr(10);
    for(auto it = arr.begin(); it != arr.end(); ++it) cin >> *it;
    // decltype
    vector<int> arr2(10);
    for(decltype(arr2.begin()) it = arr2.begin(); it != arr2.end(); ++it) cin >> *it;
    return 0;
}

Lưu ý: kiểu decltype có thể khác kiểu auto suy diễn. Xem chi tiết 12 trang giải thích tại thbecker.net.