Hãy xem xét tuyên bố sau:

double d{ 5.0 };

Nếu C ++ đã biết 5.0 là một ký tự kép, tại sao chúng ta phải xác định rõ ràng rằng d thực sự là một ký tự kép? Sẽ thật tuyệt nếu chúng ta có thể yêu cầu một biến chỉ giả sử loại phù hợp dựa trên giá trị mà chúng ta đang khởi tạo nó phải không?

1. Kiểu suy luận cho các biến được khởi tạo

Khi khởi tạo một biến, từ khóa auto có thể được sử dụng thay cho kiểu dữ liệu để yêu cầu trình biên dịch suy ra kiểu của biến từ loại của trình khởi tạo. Đây được gọi là suy luận kiểu (đôi khi còn được gọi là suy luận kiểu).

Ví dụ:

auto d{ 5.0 }; // 5.0 is a double literal, so d will be type double
auto i{ 1 + 2 }; // 1 + 2 evaluates to an int, so i will be type int

Điều này cũng hoạt động với các giá trị trả về từ các hàm:

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

int add(int x, int y)
{
    return x + y;
}
 
int main()
{
    auto sum { add(5, 6) }; // add() returns an int, so sum's type will be deduced to int
    return 0;
}

Trong khi việc sử dụng auto thay cho các kiểu dữ liệu cơ bản chỉ tiết kiệm được một vài (nếu có) các lần gõ phím, trong các bài học sau, chúng ta sẽ thấy các ví dụ mà các kiểu trở nên phức tạp và dài dòng. Trong những trường hợp đó, sử dụng tự động có thể tiết kiệm được rất nhiều thao tác nhập.

2. Kiểu suy luận cho các hàm

Trong C ++ 14, từ khóa auto đã được mở rộng để có thể suy ra kiểu trả về của một hàm từ các câu lệnh trả về trong thân hàm. Hãy xem xét chương trình sau:

auto add(int x, int y)
{
    return x + y;
}

Vì x + y đánh giá là int, trình biên dịch sẽ suy ra hàm này nên có kiểu trả về là int. Khi sử dụng kiểu trả về tự động, tất cả các câu lệnh trả về phải trả về cùng kiểu, nếu không sẽ xảy ra lỗi.

Mặc dù điều này có vẻ gọn gàng, nhưng chúng ta khuyên bạn nên tránh cú pháp này đối với các hàm thông thường. Kiểu trả về của một hàm được sử dụng rất nhiều trong việc giúp lập tài liệu cho người gọi về những gì một hàm dự kiến ​​sẽ trả về. Khi một loại cụ thể không được chỉ định, người gọi có thể hiểu sai loại hàm sẽ trả về, điều này có thể dẫn đến lỗi không cố ý.

Bạn nên

Tránh sử dụng kiểu suy luận cho các kiểu trả về của hàm.

Bạn đọc quan tâm có thể thắc mắc tại sao sử dụng auto khi khởi tạo biến thì được, nhưng lại không được khuyến khích cho kiểu trả về của hàm. Một nguyên tắc nhỏ là tự động có thể sử dụng khi xác định một biến, vì đối tượng mà biến đang suy ra một kiểu từ sẽ hiển thị ở phía bên phải của câu lệnh. Tuy nhiên, với các hàm thì không phải như vậy – không có ngữ cảnh nào để giúp chỉ ra loại hàm trả về. Người dùng thực sự sẽ phải tự tìm hiểu nội dung của hàm để xác định loại hàm được trả về. Nó kém trực quan hơn nhiều và do đó dễ xảy ra lỗi hơn.

3. Cú pháp kiểu trả về sau

Từ khóa auto cũng có thể được sử dụng để khai báo các hàm bằng cú pháp trả về theo sau, trong đó kiểu trả về được chỉ định sau phần còn lại của nguyên mẫu hàm.

Hãy xem xét hàm sau:

int add(int x, int y)
{
  return (x + y);
}

Sử dụng auto, điều này có thể được viết tương đương là:

auto add(int x, int y) -> int
{
  return (x + y);
}

Trong trường hợp này, auto không thực hiện suy luận kiểu – nó chỉ là một phần của cú pháp để sử dụng kiểu trả về theo sau.

4. Tại sao bạn muốn sử dụng cái này?

Một điều thú vị là nó làm cho tất cả các tên hàm của bạn xếp thành hàng:

auto add(int x, int y) -> int;
auto divide(double x, double y) -> double;
auto printSomething() -> void;
auto generateSubstring(const std::string &s, int start, int len) -> std::string;

Hiện tại, chúng ta khuyên bạn nên tiếp tục sử dụng cú pháp trả về hàm truyền thống. Nhưng chúng ta sẽ thấy cú pháp kiểu trả về theo sau này được tái hiện trong bài – Giới thiệu về lambdas (hàm ẩn danh).

5. Kiểu suy luận cho các kiểu tham số hàm

Nhiều lập trình viên mới thử một cái gì đó như thế này:

#include <iostream>
 
void addAndPrint(auto x, auto y) // only valid starting in C++20
{
    std::cout << x + y;
}
 
int main()
{
    addAndPrint(2, 3); // int
    addAndPrint(4.5, 6.7); // double
}

Trước C ++ 20, điều này sẽ không hoạt động, vì trình biên dịch không thể suy ra các loại cho các tham số hàm x và y tại thời điểm biên dịch. Trước C ++ 20, nếu bạn đang tìm cách tạo các hàm chung hoạt động với nhiều kiểu khác nhau, bạn nên sử dụng các mẫu hàm (được đề cập trong chương sau), không phải kiểu suy luận.

Bắt đầu từ C ++ 20, từ khóa auto có thể được sử dụng như một cách viết tắt để tạo các mẫu hàm, vì vậy đoạn code trên sẽ được biên dịch và chạy. Lưu ý rằng việc sử dụng tự động này không thực hiện suy luận kiểu.

Dành cho người học nâng cao

Các biểu thức Lambda đã hỗ trợ các tham số tự động kể từ C ++ 14. Chúng tôi sẽ đề cập đến các biểu thức lambda trong một bài học trong tương lai.

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!