Search…

C++14 - Từ Khóa auto và Khả Năng Tự Động Nhận Kiểu Khi Hiện Thực Một Hàm

15/09/20203 min read
Tìm hiểu về từ khoá auto và khả năng tự động nhận kiểu khi thực hiện một hàm trong C++14.

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;
}
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024