2014-12-15 28 views
28

Có một số người dùng Stack   Tràn người ủng hộ mạnh mẽ luôn sử dụng quy ước loại trả lại C++ 11 mới khi viết các hàm, chẳng hạn như main()->int. Tôi có thể thấy lợi thế, vì nó làm cho đồng nhất ký hiệu. Tuy nhiên, khi khai báo một con trỏ hàm, tôi không thể tìm thấy bất kỳ cách nào của việc sử dụng một hình thức lợi nhuận dấu, tức là có thể tuyên bố một trong haiSử dụng con trỏ hàm có kiểu trả về theo sau

typedef int(*fp)(int);

hoặc

using fp = int(*)(int);

cho một con trỏ hàm lấy một int và trả lại một số int.

Có cách nào để sử dụng cú pháp trả về đuôi mới khi khai báo một con trỏ hàm như vậy không? Ví dụ, một cái gì đó giống như

using fp = (*)(int)->int;

nhưng điều này không biên dịch. Nếu không, có một lý do tại sao cú pháp mới không áp dụng cho các con trỏ hàm?

Trả lời

25

Bạn phải sử dụng auto

using fp = auto (*)(int) -> int; 
typedef auto (*fp)(int) -> int; // alternatively 

Trailing kiểu trả về cú pháp có nghĩa là bạn đặt auto trước tên hàm để chỉ ra rằng kiểu trả sau (hoặc trong trường hợp của C++ 14, nên được suy luận). Đối với các con trỏ hàm, cùng một quy tắc được áp dụng ngoại trừ việc nó không thể suy ra nó (vì những lý do hiển nhiên).

Điều này đúng cho các chức năng cũng Mặc dù vậy, ví dụ bạn

main() -> int {... } 

là không hợp lệ, hoặc nếu không có sự trước auto

+0

Cảm ơn, vì lý do nào đó, tôi đã quên mất nhu cầu 'tự động 'trong các hàm trả về theo sau. Có ý nghĩa. – vsoftco

+0

Chỉ cần tìm ra nó :) Cảm ơn nhiều, sẽ chấp nhận câu trả lời của bạn như là 5 giây nhanh hơn :) – vsoftco

13

Bạn muốn một trong những tùy thuộc vào việc bạn đang sử dụng using khai hoặc một typedef :

using fp = auto (*)(int)->int; 
typedef auto (*gp)(int) -> int; 
+0

Cảm ơn, vì một lý do nào đó tôi quên mất sự cần thiết của 'auto'. – vsoftco

Các vấn đề liên quan