2012-10-31 67 views
6

Duplicate có thể:
What is “->” after function declaration?Sử dụng -> trong khai báo hàm

Tôi vừa mới đi qua các ví dụ sau của C chức năng ++ sử dụng auto từ khóa mới, và tôi đã hy vọng ai đó có thể giúp tôi hiểu ý nghĩa của cú pháp.

template <class T, class U> 
auto add(T t, U u) -> decltype(t + u); 

auto f = [](int a, int b) -> int { 
    return a*b; 
}; 

Cụ thể, tôi đang bối rối về người dùng của -> trong chữ ký chức năng và tôi mong chờ những phải được viết bằng như

template <class T, class U> 
auto add(T t, U u) 
{ 
    decltype(t + u); 
} 

auto f = [](int a, int b){ 
    return a*b; 
}; 

gì các nhà điều hành -> làm ở đó, và ở đâu tôi có thể tìm hiểu thêm về cú pháp này không?

Trả lời

13

Nhà điều hành -> đang làm gì ở đó?

Đó là loại trả về cuối. Thay vì:

int f(); 

bạn tương đương có thể viết:

auto f() -> int; 

Nếu kiểu trả về phụ thuộc vào các loại tham số chức năng, sau đó bạn cần phải sử dụng hình thức này; các thông số không khả dụng cho đến sau khi chúng được khai báo:

decltype(t+u) add(T t, U u); // Error: uses `t` and `u` before they're declared 
auto add(T t, U u) -> decltype(t + u); // OK 

Ngoài ra, nếu bạn muốn chỉ định kiểu trả về của lambda, thì bạn phải sử dụng biểu mẫu này; mặc dù, như bạn chỉ ra, trong nhiều trường hợp (bao gồm cả trường hợp này), bạn không cần phải xác định điều đó.

2

Cú pháp này (được gọi là dấu-trở-type) là một workaround cho việc sử dụng biểu như kiểu trả về, như sau:

template <class T, class U> 
    decltype(t + u) add(T t, U u) { ... } 

... sẽ không đúng trong C++.

Có thể nói vấn đề này được giải thích đủ tốt (tôi giả sử) trong Wiki.

+1

... không đúng vì nó sử dụng 't' và' u' trước khi chúng nằm trong phạm vi (chúng chỉ được khai báo trong danh sách tham số). –

0

Toán tử -> trong khai báo hàm xác định kiểu trả về cho các hàm trả về "tự động". Nó được định nghĩa trong chương 8 của tiêu chuẩn C++ 11.

3

[dcl.spec.auto]/2 giải thích làm thế nào để viết phần khai báo hàm với kiểu tự động quay trở lại:

Các auto type-specifier thể xuất hiện với một declarator chức năng với một dấu-trở-type (8.3 .5) trong bất kỳ ngữ cảnh nào mà người kê khai đó là hợp lệ.

Và sau đó, trong [dcl.fct]/12, có ghi chú:

Kiểu chữ và kiểu trả về đôi khi thuận tiện khi kiểu trả về của hàm phức tạp. Ví dụ, hàm fpif trên có thể đã được tuyên bố

typedef int IFUNC(int); 
IFUNC* fpif(int); 

hoặc

auto fpif(int)->int(*)(int) 

Một dấu-trở-type là hữu ích nhất cho một loại đó sẽ là phức tạp hơn để xác định trước khi declarator-id :

template <class T, class U> auto add(T t, U u) -> decltype(t + u); 

hơn

template <class T, class U> decltype((*(T*)0) + (*(U*)0)) add(T t, U u); 
1

->loại trả lại theo sau.

C++ 11 đề xuất cú pháp khai báo hàm thay thế. auto từ khóa thay thế loại trả về chức năng thông thường và loại trả lại thực tế đi sau ->.

Ví dụ,

auto f (int a, int b) -> int; 

tương đương với

int f(int a, int b); 

Tính năng này rất hữu ích nhất cho mẫu chức năng nơi kiểu trả về phải được rút ra từ các thông số mẫu.

Ví dụ,

template <class T, class U> 
auto add(T t, U u) -> decltype(t + u); 

kiểu trả về sẽ là kiểu của biểu thức (t+u).

1

Toán tử -> đang làm gì ở đó và tôi có thể tìm hiểu thêm về cú pháp này ở đâu?

Có một giải thích rất hay về điều này trên cprogramming.

Bản chất của việc sử dụng -> (trong trường hợp của bạn) hoặc tự động, decltype tiện lợi và cho phép bạn tập trung nhiều hơn vào logic lập trình.

loại trả về cuối (->) giúp bạn bao gồm thông tin kiểu trả về trong bản khai báo hàm.

Trong trường hợp ví dụ thay thế của bạn:

auto add(T t, U u) 
{ 
    decltype(t + u); 
} 

Nếu chức năng là khá phức tạp, sau đó nó sẽ là khá khó khăn (không rõ ràng rõ ràng) cho một độc giả của chương trình của bạn để tìm ra những gì các loại lợi nhuận kỳ vọng Là.

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