2014-09-25 16 views
8
typedef int (*A)[3]; 

int (**p)[3] = new A;    // OK 
int (**q)[3] = new (int(*)[3]); // OK 
int (**r)[3] = new int (*)[3];  // error 

Lỗi từ GCC là error: expected primary-expression before ')' token. Tại sao các dấu ngoặc đơn phụ được yêu cầu trong biểu thức này?Tại sao có lỗi int (*) [3] mới?

+0

liên quan (nhưng không trùng lặp): http://stackoverflow.com/q/16634713/1505939 –

+1

Bởi vì một * kiểu mới-id * may không chứa dấu ngoặc đơn. Nhưng đó là tất nhiên không phải là một câu trả lời thỏa mãn. – dyp

+0

Có thể điều này liên quan đến việc định hướng; ví dụ. 'new int()' có thể được hiểu là cố gắng phân bổ một hàm 'int (void)' – dyp

Trả lời

10

Tiêu chuẩn xác định new-type-id là chuỗi dài nhất người khai báo mới. Ngoài ra còn có một lưu ý, trong đó mô tả một tình huống tương tự (mặc dù nó phân bổ con trỏ đến chức năng):

5.3.4 mới [expr.new]

....

kiểu mới-id:
        type-specifier-seqmới declaratoropt

mới declarator:
        ptr-operator new-declaratoropt
        noptr-new-declarator

noptr-new-declarator:
        [  biểu  ]   thuộc tính-specifier-seqopt
        noptr-new-declarator   [  liên tục thể hiện  ]   thuộc tính-specifier-seq opt

....

Các kiểu mới-id trong một mới- biểu thức là chuỗi dài nhất có thể của người khai báo mới. [Lưu ý: điều này ngăn cản sự mơ hồ giữa các toán tử khai báo &, &&, *[] và đối sánh biểu thức của chúng.-   cuối note] [Ví dụ:

new int * i; // syntax error: parsed as (new int*) i, not as (new int)*i 

Các * là declarator con trỏ và không phải là toán tử nhân. -   cuối dụ]

[Note: ngoặc đơn trong một kiểu mới-id của một mới thể hiện thể có tác dụng đáng ngạc nhiên. [Ví dụ:

new int(*[10])(); // error 

là vô hình thành vì các ràng buộc là

(new int) (*[10])(); // error 

Thay vào đó, phiên bản ngoặc một cách rõ ràng của new hành có thể được sử dụng để tạo các đối tượng của các loại hợp chất (3.9. 2):

new (int (*[10])()); 

phân bổ một mảng 10 con trỏ đến hàm (không tham gia đối số) và trả lại int. -   cuối dụ] -   cuối note]

+0

@MattMcNabb Như thường lệ, với tiêu chuẩn thì hơi khó. Tôi đã thêm một số công trình ngữ pháp, nhưng chúng chưa hoàn chỉnh. Ví dụ. những thứ như _expression_ hoặc _attribute-specifier-seq_ không được định nghĩa ở đây. – AlexD

+0

Biểu thức @AlexD * * sẽ quá phức tạp và * thuộc tính-specifier-seq * không liên quan. IMHO, phần thú vị là * biểu thức mới * có thể chứa một (hoàn toàn) dấu ngoặc đơn * type-id * hoặc a (n chưa được kết hợp) * new-type-id *, trong đó * new-type-id * có thể (theo như tôi thấy) không chứa bất kỳ dấu ngoặc đơn nào. – dyp

+0

@dyp Theo tôi hiểu, _new_type_id_ có thể chứa _expression_, có thể chứa dấu ngoặc đơn, ví dụ: 'int mới [(3)]'. BTW, cảm ơn bạn đã chỉnh sửa bài đăng đầu tiên! – AlexD

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