2013-05-16 41 views
36

Taken trực tiếp từ http://herbsutter.com/2013/05/09/gotw-1-solution/phân tích cú pháp gây nhiều tranh cãi nhất của C++ lại

Trong khi widget w(); là rõ ràng đối với tôi, tôi không có ý tưởng làm thế nào mã dưới đây có thể là một tuyên bố chức năng?

// same problem (gadget and doodad are types) 
// 
widget w(gadget(), doodad()); // pitfall: not a variable declaration 

Làm cách nào có thể?

+0

liên quan/dupe: http://stackoverflow.com/questions/9327505/about-pointers-to-functions-in-function-declarations – jrok

Trả lời

44

Trong một tuyên bố chức năng, các tham số kiểu phân rã mảng vào con trỏ đến phần tử đầu tiên, các tham số kiểu chức năng phân rã thành một con trỏ hàm, vì vậy chữ ký sẽ là:

widget w(gadget(*)(), doodad(*)()); 

Đó là, một chức năng mà mất như là đối số đầu tiên một con trỏ tới một hàm dùng không có đối số và trả về gadget, mà sẽ đưa như là đối số thứ hai là một con trỏ tới một hàm dùng không có đối số và trả về một doodad và rằng chức năng tự trả về một widget

Thậm chí còn hơn thú vị hoặc confu hát ca, như:

// assume 'x' is a variable defined somewhere: 
widget w(gadget(x)); 

Làm thế nào có thể rằng được hiểu như là một tuyên bố chức năng? Ý tôi là, x là một biến, phải không? Vâng, khi khai báo một biến, bạn có thể thêm dấu ngoặc đơn phụ, vì vậy gadget x;gadget (x); cả hai đều khai báo cùng một biến x. Điều tương tự cũng áp dụng đối với hoạt động lập luận như vậy mã trên trông giống như một lời tuyên bố của một hàm mà phải mất một đối số đầu tiên mang tên x loại gadget và trả về một widget ...

+46

Mẹ Thiên Chúa. ಠ_ಠ – Yanko

+1

+1 lần đầu tiên biết rằng đối số của phân rã chức năng loại thành con trỏ hàm. cảm ơn bạn! – taocp

+4

@Yanko: tất nhiên, đó là lý do tại sao bây giờ bạn có thể sử dụng 'widget w {gadget {}, doodad {}};' => điều này không thể được hiểu sai như một hàm :) –

1

Đó là chức năng mà được hai chức năng, mà trả gadgetdoodad và một trong số họ không có đối số.

Ví dụ biên dịch tốt.

#include <iostream> 
class widget{}; 
class gadget{}; 
class doodad{}; 
gadget a(){} 
doodad b() {}; 
widget w(gadget(), doodad()){ 
} 
int main() { 
    w(a,b); 
    return 0; 
} 

http://ideone.com/YjZK9Y

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