Danh sách bài viết về C++11
Nhắc lại auto trong C++11
C++11 - Từ Khóa auto có khả năng tự động nhận dạng được kiểu dữ liệu của khai báo biến hoặc kiểu trả về trong 1 lambda.
int sum(int a, int b) { return a + b; } int main() { // i kieu int vi 5 la kieu int auto i = 5; // c kieu char vi 'k' la kieu char auto c = 'k'; // s kieu const char* vi "www.stdio.vn" kieu const char* auto s = "www.stdio.vn"; // r kieu int vi ham sum co kieu tra ve la int auto r = sum(1, 2); // max co kieu tra ve la int vi Lambda return la 1 kieu int // max se co dinh nghia day du la auto max = [](int a, int b) { return a > b ? a : b; }; // x la kieu int vi max co kieu tra ve la int auto x = max(1, 2); return 0; }
Trong C++11, không có khả năng dự đoán được kiểu trả về của 1 hàm do đó, cú pháp sau sẽ không tồn tại.
auto sum(int a, int b) { return a + b; }
auto trong C++14
Với C++14, trình biên dịch hỗ trợ thêm tính năng nhận dạng kiểu dữ liệu được trả về từ hàm dựa vào kiểu dự liệu trong hàm trả về.
auto func(int a, int b) { if (a > b) return a; else return b; } int main() { int t = func(1, 2); return 0; }
Như hàm func
trên, kiểu trả về của a
(dòng 4) và b
(dòng 6) đều là kiểu int
nên trình biên dịch sẽ dự đoán được auto
ở dòng 1 phải là kiểu int
và biên dịch sẽ thành công.
Đánh đố trình biên dịch hơn như sau
auto func(int a, double b) { if (a > b) return a; else return b; }
Ở dòng 1 thì a
là kiểu int
còn b
là kiểu double
, do đó, việc return
sẽ gây ra 2 trường hợp là int
hay double
(dòng 4 và 6) làm bối rối trình biên dịch không biết lựa chọn trường hợp nào. Trong trường hợp này, có thể đơn giản hóa là quay lại cách code thông thường đó là chỉ định kiểu trả về là kiểu gì hoặc kiểu trả về theo kiểu của Lambda hoặc nếu kiểu dữ liệu quá dài, để đỡ tốn thời gian có thể kết hợp thêm decltype (xem thêm C++11 - Từ Khóa decltype).
// Cach thong thuong int func(int a, double b) { if (a > b) return a; else return b; } // Cach nhu Lambda auto func(int a, double b) -> int { if (a > b) return a; else return b; } // Cach nhu Lambda ket hop decltype auto func(int a, double b) -> decltype(a) { if (a > b) return a; else return b; }