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
etham 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
elà 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
elà 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.