2013-01-16 16 views
8

Tôi đang xem xét một số mã cũ và đi qua x=new(Foo); (lưu ý dấu ngoặc đơn xung quanh loại được cung cấp). Tôi đã thử nghiệm các biến thể và nó có vẻ giống như x=new Foo;Có phải "x = new (Foo)" giống như "x = new Foo" cho một Foo tùy ý không?

Foo là cấu trúc dữ liệu không phải POD. Một số chương trình rò rỉ bộ nhớ ngoài đang gắn cờ dòng - nó cấp phát bộ nhớ cho một tham số CORBA, do đó người gọi cần phải quan tâm đến việc xóa nhưng đó là một vấn đề riêng biệt với nhiều lớp vô hướng.

Phân tích của tôi có chính xác và có chấp nhận được không?

Trả lời

5

Nếu tên của loại có dấu ngoặc đơn thì phải được đặt trong dấu ngoặc đơn. Các loại khác cũng có thể được đính kèm.

Ví dụ nơi ngoặc được yêu cầu:

new int(*[10])(); // parser error: parsed as (new int) (*[10])() 
new (int (*[10])()); // OK: allocates an array of 10 pointers to functions 

Từ cppreference.com: new expression

10

Chính xác, nhưng phong cách ít nhất là bất thường.

Đôi khi, các dấu ngoặc đơn xung quanh tên loại hoàn chỉnh được phép, nhưng trong trường hợp này là không liên quan. Nó giống như đặt dấu ngoặc đơn xung quanh một biểu thức mà không cần thiết. Có lẽ sự tương tự gần nhất sẽ là

return(0); /* looks like a function, but isn't */ 

gây nhầm lẫn, các dấu ngoặc được yêu cầu cho các nhà điều hành sizeof, khi đi qua nó một cái tên kiểu nhưng không phải khi đi qua nó một biểu thức. Cá nhân tôi thấy rằng như là một mâu thuẫn, và sẽ không chọn để lây lan nó cho phần còn lại của ngôn ngữ.

+4

Đó là những gì tôi nghĩ quá, nhưng nó quay ra rằng nó phải có nhiều tinh tế hơn thế. Ví dụ, đoạn mã sau không biên dịch: '(int) main() {return 0; } '. –

+3

Không đúng, dấu ngoặc đơn thường không được phép. – zch

+2

@zch Sau đó, có một (không có tham chiếu thumping, mặc dù tôi cảm giác này đến) danh sách ngắn khi ngoặc đơn * được * cho phép xung quanh các loại? –