Bài viết là tài liệu tham khảo cho khóa đào tạo lập trình C/C++ của STDIO Training.
Tìm hiểu và đăng ký học tại đây.
La Kiến Vinh Với C++11 ta cũng biết khả năng nhận biết 1 kiểu dữ liệu với từ khóa auto, tuy nhiên với việc hiện thực 1 hàm thì thì C++11 chưa hỗ trợ khả năng nhận kiểu dữ liệu cho giá trị trả về trong hàm ngoại trừ biểu thức Lambda, trong C++14 đã hỗ trợ thêm tính năng này.
Nội dung bài viết

Giới thiệu

Trong C++14, từ khóa auto đã được cập nhật nhiều hơn về mặt tính năng, đó là khả năng nhận dạng kiểu dữ liệu được trả về từ trong một hàm, với C++11 chỉ hỗ trợ cho biểu thức Lambda.

Để trải nghiệm được C++14 bạn cần GCC 4.8+ hoặc trong bài viết này, tôi dùng Visual Studio 2015 Community hoặc phiên bản mới hơn.

Đối tượng hướng đến

Dành cho các đối tượng muốn tiếp cận với C++14, tuy nhiên nên biết sơ lược về C++11 sẽ dễ tiếp cận hơn.

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 một 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, ta 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;
}
THẢO LUẬN
ĐÓNG