2015-04-06 9 views
7

§8/5:Tôi cần một số trợ giúp về §8/5 trong spec

Các tùy chọn thuộc tính-specifier-seq trong một dấu-trở-type appertains đến sự trở lại chỉ kiểu. Các loại loại-id trong một trailing-return-type bao gồm chuỗi dài nhất có thể là khai báo trừu tượng s. [Lưu ý: Điều này giải quyết sự ràng buộc mơ hồ của các khai báo mảng và hàm. [Ví dụ:

auto f()->int(*)[4]; // function returning a pointer to array[4] of int 
        // not function returning array[4] of pointer to int 

-end dụ] -end note]

Các "loại-id trong một dấu-trở-type" không có ý nghĩa với tôi, đơn giản bởi vì loại trả về theo sau không chứa loại id theo ngữ pháp.

Tôi cũng không hiểu "ràng buộc mơ hồ" của khai báo mảng và chức năng. Theo như tôi có thể hiểu được

auto f() -> int*[4]; // function returning an array of 4 pointers to int 
auto f() -> int(*)[4]; // function returning a pointer to an array of 4 ints 
+4

Bạn có thể đặt câu hỏi không? –

+2

Có lẽ là * type-id * đề cập đến toàn bộ điều sau '->', vì một dấu * kiểu-specifier-seq * sinh ra/là một tập con của * type-specifier-seq * (xem C++ 11 §7.1.6/1). –

+0

@ Cheersandhth.-Alf Tôi nghĩ điều đó đúng. Mặc dù nó khá là khó viết. –

Trả lời

5
int *f(); 

Khai báo một hàm số của () trở về con trỏ đến int.

int *f()[4]; 

Khai báo chức năng () trả về mảng 4 con trỏ đến int. Lưu ý rằng đây là hình dạng không đúng.

int (*f())[4]; 

Khai báo một hàm của () trả về con trỏ tới mảng 4 int.

Bây giờ, trong

auto f() -> int(*)[4] 
//  ^^^^^^^^^^^^^--- 

gì quy tắc giải quyết là liệu [4] là một phần của dấu-trở-type, và do đó là một phần của chức năng declarator. Nếu [4] là một phần của dấu-trở-type, sau đó khai báo ở trên tuyên bố một chức năng của () trở về con trỏ đến mảng của 4 int.

Nếu không, sau đó [4] sẽ tạo thành một mảng declarator đó không phải là một phần của chức năng declarator, và phân tích cú pháp sẽ được điều chỉnh bởi [dcl.array]/p1:

Trong một tuyên bố T D nơi D có dạng

D1 [ constant-expression_opt ] attribute-specifier-seq_opt 

và loại các định danh trong tờ khai T D1 là “có nguồn gốc-declarator-type-listT ”[..., Nếu] giá trị của biểu thức hằng là N, [...] loại nhận dạng của D là “có nguồn gốc-declarator-type-list mảng của NT”.

và kể từ khi tuyên bố auto f()-> int (*)f là "chức năng của () trở về con trỏ đến int", thay cho chúng ta biết rằng điều này sẽ tuyên bố một hàm trả về một mảng của 4 con trỏ để int, giống như int *f()[4];.

+1

Theo ngữ pháp trong [dcl.decl] p4, phải có một 'noptr-declarationator' ở bên trái của' [4] ', nhưng có vẻ như' f() -> int (*) 'không không đủ điều kiện làm 'noptr-declarationator'. – cpplearner

+1

... Trong [N2541] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2541.htm), 'f() -> int (*)' đủ điều kiện với tư cách là một 'khai báo trực tiếp', có thể xuất hiện ở bên trái của' [4] ', do đó cần phải định hướng. Nhưng ngữ pháp của các nhà khai báo đã trải qua một vài thay đổi kể từ đó. Tôi tự hỏi liệu sự mơ hồ đã được âm thầm loại bỏ bởi một trong những thay đổi này. – cpplearner

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