Có một số trường hợp nhất định mà bạn phải sử dụng loại trả về theo sau. Đáng chú ý nhất, một kiểu trả về lambda, nếu được xác định, phải được xác định thông qua một kiểu trả về theo sau. Ngoài ra, nếu kiểu trả về của bạn sử dụng số decltype
yêu cầu tên đối số nằm trong phạm vi, thì phải sử dụng loại trả về theo sau (tuy nhiên, thường có thể sử dụng declval<T>
để giải quyết vấn đề thứ hai này).
Loại trả về theo sau có một số lợi thế nhỏ khác. Ví dụ, hãy xem xét một tổ chức phi inline định nghĩa hàm thành viên bằng cách sử dụng cú pháp chức năng 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
{
// ...
}
typedefs Thành viên đang không ở 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 tôi phải lặp lại trình độ lớp hai lần . Nếu chúng ta sử dụng một kiểu trả về trailing, chúng tôi không cần phải lặp lại tên của các loại:
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ư vậy, 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 định nghĩa nội tuyến, sau đó 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++ Bây giờ năm 2012, Alisdair Meredith chỉ ra rằng nếu bạn sử dụng trailing loại trở lại một cách nhất quán, tên của tất cả các chức năng của bạn xếp hàng gọn gàng:
auto foo() -> int;
auto bar() -> really_long_typedef_name;
Tôi đã sử dụng các kiểu trả về theo sau ở mọi nơi trong CxxReflect, vì vậy nếu bạn đang tìm kiếm một ví dụ về cách mã sử dụng chúng một cách nhất quán, bạn có thể xem ở đó (ví dụ: the type
class).
Nó có hầu hết cho 'decltype' trên đối số. –
những gì CatPlusPlus nói: làm cho không có ý nghĩa nhiều bằng cách sử dụng nó trong ví dụ của bạn – stijn
@ Plus Plus Plus Điều này có nghĩa rằng bạn để lại những thứ như họ đang ở trong C + + 03, trừ khi bạn cần phải lấy được kiểu trả về? – mirk