2013-05-16 5 views
36

से http://herbsutter.com/2013/05/09/gotw-1-solution/सी ++ के सबसे अप्रिय पार्स फिर

जबकि widget w(); मेरे लिए स्पष्ट है सीधे लिया, मैं कैसे नीचे कोड एक समारोह घोषणा हो सकता है पता नहीं है?

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

यह कैसे संभव है?

+0

संबंधित/शिकार: http://stackoverflow.com/questions/9327505/about-pointers-to-functions-in-function-declarations परमेश्वर के – jrok

उत्तर

44

एक समारोह घोषणा में, पहला तत्व की ओर इशारा में प्रकार सरणी क्षय के तर्कों, के एक समारोह सूचक में प्रकार समारोह क्षय तर्क है, तो हस्ताक्षर होगा:

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

है यही कारण है, एक समारोह है कि पहला तर्क के रूप में एक समारोह कोई तर्क लेने और gadget लौटने, कि कोई भी तर्क ले रहे हैं और एक doodad लौटने और समारोह में ही रिटर्न कि एक widget

वहाँ और भी अधिक कर रहे हैं एक समारोह के लिए एक सूचक दूसरा तर्क के रूप में लेता है के लिए सूचक ले जाता है दिलचस्प या confu मामलों गाते हैं, जैसे:

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

कैसे सकता है कि एक समारोह घोषणा के रूप में व्याख्या की जा? मेरा मतलब है, x एक चर है, है ना? खैर, एक चर घोषित करते समय आप अतिरिक्त कोष्ठक जोड़ सकते हैं, इसलिए gadget x; और gadget (x); दोनों एक ही चर x घोषित करते हैं। एक ही तर्क कार्य करने के लिए तो कोड के ऊपर एक समारोह है कि प्रकार gadget की x नाम के एक पहला तर्क लेता है की घोषणा की तरह दिखता है पर लागू होता है और एक widget रिटर्न ...

+46

माँ। ಠ_ಠ – Yanko

+1

+1 पहली बार यह जानकर कि फ़ंक्शन पॉइंटर में प्रकार फ़ंक्शन क्षय के तर्क। धन्यवाद! – taocp

+4

@Yanko: बेशक, यही कारण है कि अब आप 'विजेट डब्ल्यू {गैजेट {}, डूडाड {}} का उपयोग कर सकते हैं;' => इसे फ़ंक्शन के रूप में गलत समझा नहीं जा सकता :) –

1

यह समारोह है कि दो कार्य हो जाता है, कि gadget और doodad रिटर्न और उनमें से कोई भी तर्क नहीं मिलता है।

उदाहरण जो ठीक है संकलित करता है।

#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

संबंधित मुद्दे