Kiểu tự động và kiểu khai báo phục vụ các mục đích khác nhau nên chúng không ánh xạ 1-1. auto là một từ khóa trong C ++ 11 trở lên được sử dụng để loại trừ tự động. Bộ chỉ định kiểu khai báo mang lại kiểu của một biểu thức được chỉ định. Không giống như auto suy ra kiểu dựa trên các giá trị được gán cho biến, kiểu khai báo sẽ suy ra kiểu từ một biểu thức được truyền cho nó. Giá trị được trả về bởi kiểu khai báo có thể được sử dụng trực tiếp để xác định một biến khác.
auto tuân theo quy tắc khấu trừ tham số mẫu. Bạn có thể đọc thêm về quy tắc này tại https://en.cppreference.com/w/cpp/language/template_argument_deduction
Trong khi khai báo có các quy tắc, nó phải tuân theo được định nghĩa trong tiêu chuẩn. Đây là một đoạn trích từ tiêu chuẩn với các quy tắc sau:
Tương tự với toán tử sizeof, toán hạng của kiểu khai báo không được đánh giá. Một cách không chính thức, kiểu được trả về bởi kiểu khai báo (e) được suy ra như sau -
- Nếu biểu thức e tham chiếu đến một biến trong phạm vi cục bộ hoặc không gian tên, một biến thành viên tĩnh hoặc một tham số hàm, thì kết quả là kiểu được khai báo của biến hoặc tham số đó
- Nếu e là một lệnh gọi hàm hoặc một lệnh gọi toán tử được nạp chồng, thì kiểu khai báo (e) biểu thị kiểu trả về đã khai báo của hàm đó
- Ngược lại, nếu e là giá trị, thì kiểu khai báo (e) là T &, trong đó T là kiểu e; nếu e là một rvalue, kết quả là T
Những ngữ nghĩa này được thiết kế để đáp ứng nhu cầu của người viết thư viện nói chung, đồng thời trực quan cho các lập trình viên mới làm quen vì kiểu khai báo trả về luôn khớp với kiểu của đối tượng hoặc hàm chính xác như được khai báo trong mã nguồn. Chính thức hơn, Quy tắc 1 áp dụng cho biểu thức id không có dấu ngoặc đơn và biểu thức truy cập thành viên lớp. Đối với các lệnh gọi hàm, kiểu suy ra là kiểu trả về của hàm được chọn tĩnh, được xác định bởi các quy tắc giải quyết quá tải.
Ví dụ
Ví dụ sử dụng kiểu tự động và kiểu khai báo,
#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; }
Lưu ý rằng kiểu được biểu thị bằng kiểu khai báo có thể khác với kiểu được suy ra bằng tự động. Bạn có thể đọc thêm về những khác biệt nhỏ này trong giải thích dài 12 trang về loại trừ trong C ++ - https://thbecker.net/articles/auto_and_decltype/section_01.html