2011-12-12 12 views
11

संभव डुप्लिकेट:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?सी ++ डरावना निर्माता

चलें इस कोड

class Foo { 
    Foo(int) { } 
}; 

फिर हम वहाँ परिणाम है:

int main() { 
    Foo f1 = Foo(5); // 1: OK, explicit call 
    Foo f2(5); // 2: OK, implicit call 
    Foo f3(); // 3: no error, "f3 is a non-class type Foo()", how so? 
    Foo f4(f1); // 4: OK, implicit call to default copy constructor 
    Foo f5; // 5: expected error: empty constructor missing 
} 

क्या आप बता सकते हैं कि के मामले में क्या हो रहा है?

+13

खोज: vexing parse – Nim

+0

@Nim: एक उत्तर होना चाहिए था। –

+0

यह भी ध्यान दें कि उदाहरण 5 ऐसा करने के लिए अपेक्षित उदाहरण 3 कर रहा है और डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करता है। – Joe

उत्तर

8

Foo f3(); नामक एक फ़ंक्शन घोषित करता है, जिसमें Foo का रिटर्न प्रकार होता है।

+0

आह, ज़ाहिर है! मैं रचनाकारों पर इतना ध्यान केंद्रित कर रहा था ... –

12

तीसरी पंक्ति को ऐसे फ़ंक्शन घोषित करने के रूप में पार्स किया गया है जो कोई तर्क नहीं लेता है और Foo देता है।

2

आपने एफ 3 नामक एक फ़ंक्शन को परिभाषित किया है जो 3 के मामले में एक foo देता है। 5 के मामले में, आपके पास कोई डिफ़ॉल्ट कन्स्ट्रक्टर परिभाषित नहीं है, इसलिए आपको कोई त्रुटि मिलती है।

5

सी ++ का एक नियम है कि यदि किसी कथन को फ़ंक्शन घोषणा के रूप में व्याख्या किया जा सकता है, तो इसका अर्थ इस तरह से किया जाता है।

इसलिए वाक्यविन्यास Foo f3(); वास्तव में एक फ़ंक्शन घोषित करता है जिसमें कोई तर्क नहीं होता है और Foo देता है। Foo f3; लिखकर इसे चारों ओर काम करें, यह डिफ़ॉल्ट कन्स्ट्रक्टर भी कॉल करेगा (यदि कोई है, तो निश्चित रूप से)।

4
  • f1 सुस्पष्ट रूप से कॉल के बाद प्रति निर्माता का आह्वान, तो आप इस एक
  • f2 पर गलत एक स्पष्ट निर्माता कॉल है थे // तुम गलत यहाँ भी
  • f3 एक समारोह
  • f4 है वाणी थे दोबारा कॉपी कन्स्ट्रक्टर, जैसे f1 // आप यहां हैं
  • f5 डिफ़ॉल्ट कन्स्ट्रक्टर // कॉल करेगा, आप यहां फिर से हैं
+0

'फू एफ 6 = 5;' एक अंतर्निहित कन्स्ट्रक्टर कॉल द्वारा होगा? IIRC। –

+0

@ डगलस: हाँ, यह सही होगा। – Xeo

3

यह आप क्या सोचते हैं यह है नहीं है:

Foo f3(); 

आप सोच सकते इस डिफ़ॉल्ट निर्माता की सुस्पष्ट रूप से कॉल है, लेकिन यह नहीं है। यह वास्तव में f3 नामक फ़ंक्शन की घोषणा है जो कोई पैरामीटर नहीं लेता है और मूल्य के अनुसार Foo देता है।

कि इसे एक कन्स्ट्रक्टर कॉल के बजाए फ़ंक्शन घोषणा के रूप में पार्स किया गया है जिसे Most Vexing Parse के नाम से जाना जाता है।

+0

नहीं, यह नहीं है। एमवीपी तब होता है जब आप तर्क प्रदान करते हैं और यह अभी भी एक समारोह घोषणा की तरह दिखता है। यह एमवीपी नहीं है बल्कि यह प्रोग्रामर मूर्खतापूर्ण है –

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