Có một số trường hợp bạn phải sử dụng kiểu trả về theo sau. Đáng chú ý nhất, kiểu trả về lambda, nếu được chỉ định, phải được chỉ định thông qua kiểu trả về theo sau. Ngoài ra, nếu kiểu trả về của bạn sử dụng một decltype
yêu cầu tên đối số phải nằm trong phạm vi, thì kiểu trả về theo sau phải được sử dụng (tuy nhiên, một kiểu thường có thể sử dụng declval<T>
để giải quyết vấn đề sau này).
Kiểu trả về theo sau có một số ưu điểm nhỏ khác. Ví dụ: hãy xem xét một định nghĩa hàm thành viên không nội tuyến bằng cách sử dụng cú pháp hàm truyền thống:
struct my_awesome_type
{
typedef std::vector<int> integer_sequence;
integer_sequence get_integers() const;
};
my_awesome_type::integer_sequence my_awesome_type::get_integers() const
{
}
Các typedef thành viên không nằm trong phạm vi cho đến khi tên của lớp xuất hiện trước đó ::get_integers
, vì vậy chúng ta phải lặp lại tiêu chuẩn của lớp hai lần. Nếu chúng ta sử dụng kiểu trả về theo sau, chúng ta không cần lặp lại tên của kiểu:
auto my_awesome_type::get_integers() const -> integer_sequence
{
}
Trong ví dụ này, nó không phải là một vấn đề lớn, nhưng nếu bạn có tên lớp dài hoặc hàm thành viên của các mẫu lớp không được xác định nội tuyến, thì nó có thể tạo ra sự khác biệt lớn về khả năng đọc.
Trong phiên "Fresh Paint" của mình tại C ++ Now 2012, Alisdair Meredith đã chỉ ra rằng nếu bạn sử dụng các kiểu trả về theo sau một cách nhất quán, thì tên của tất cả các hàm của bạn sẽ được sắp xếp gọn gàng:
auto foo() -> int;
auto bar() -> really_long_typedef_name;
Tôi đã sử dụng trailing kiểu trả về ở khắp mọi nơi trong CxxReflect , vì vậy nếu bạn đang tìm kiếm một ví dụ về mã vẻ sử dụng chúng như thế nào một cách nhất quán, bạn có thể có một cái nhìn ở đó (ví dụ, các type
lớp ).
decltype
cuộc tranh luận.