दिलचस्प पोस्ट
Xcode चयनित गंतव्य पर नहीं चल सकता एंड्रॉइड स्टूडियो में गेम ग्रिड आउटपुट नहीं है? Python में deprecation चेतावनियों को अनदेखा कैसे करें द्विदिश मानचित्र स्ट्रिंग के शब्दों को पुनरावृति करने का सबसे शानदार तरीका मैं कैसे जांच सकता हूं कि एकाधिक चर समान मूल्य के बराबर हैं? Linq द्वारा प्रत्येक समूह द्वारा समूह और आदेश द्वारा आदेश? ओवरलैप के साथ और बिना निश्चित आकार के टुकड़ों में एक संकीर्ण सरणी कैसे विभाजित? जावा: निष्पादक सेवा कि एक निश्चित कतार आकार के बाद सबमिशन पर ब्लॉक करता है जावास्क्रिप्ट में केस असंवेदनशील स्ट्रिंग प्रतिस्थापन? क्या एसटीडी :: मंजिल के बाद एक इंटर्निंग का सही परिणाम की गारंटी है? आईओएस एप्लिकेशन स्प्लैश स्क्रीन के लिए आकार क्या है? इसका क्या मतलब है? "पार्स त्रुटि: सिंटैक्स त्रुटि, अप्रत्याशित T_PAAMAYIM_NEKUDOTAYIM" XCode 4 में शीर्ष लेख खोज पथ गतिशील रूप से एक JComboBox में आइटम जोड़ने

रिक्त कोष्ठ के साथ डिफ़ॉल्ट निर्माता

क्या कोई अच्छा कारण है कि सीएआर में डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करने के लिए राउंड ब्रैकेट्स (कोष्ठकों) का एक खाली सेट मान्य नहीं है?

MyObject object; // ok - default ctor MyObject object(blah); // ok MyObject object(); // error 

मुझे लगता है कि "()" स्वचालित रूप से हर समय टाइप करने लगता है क्या इसका कोई उचित कारण नहीं है?

Solutions Collecting From Web of "रिक्त कोष्ठ के साथ डिफ़ॉल्ट निर्माता"

सबसे सफ़ेद पर्स

यह "सी ++ का सबसे सफ़ेद पर्स" के रूप में जाना जाता है। मूल रूप से, कुछ भी जो संकलक द्वारा एक घोषणा के रूप में व्याख्या किया जा सकता है, उसे घोषणा के रूप में व्याख्या किया जाएगा

एक ही समस्या का एक अन्य उदाहरण:

 std::ifstream ifs("file.txt"); std::vector<T> v(std::istream_iterator<T>(ifs), std::istream_iterator<T>()); 

v को 2 पैरामीटर के साथ कार्य की घोषणा के रूप में व्याख्या किया गया है

वर्कअराउंड एक दूसरे जोड़ी के कोष्ठकों को जोड़ना है:

 std::vector<T> v((std::istream_iterator<T>(ifs)), std::istream_iterator<T>()); 

या, यदि आपके पास सी +11 और लिस्ट-इनिशियलाइज़ेशन (वर्दी आरंभीकरण के रूप में भी जाना जाता है) उपलब्ध है:

 std::vector<T> v{std::istream_iterator<T>{ifs}, std::istream_iterator<T>{}}; 

इसके साथ, ऐसा कोई तरीका नहीं है जिसे एक फ़ंक्शन घोषणा के रूप में समझा जा सकता है।

क्योंकि यह फ़ंक्शन के लिए घोषणा के रूप में माना जाता है:

 int MyFunction(); // clearly a function MyObject object(); // also a function declaration 

फ़ंक्शन घोषणा के लिए एक ही वाक्यविन्यास का उपयोग किया जाता है – फ़ंक्शन object , कोई पैरामीटर नहीं ले रहा है और MyObject लौट रहा है

क्योंकि कंपाइलर सोचता है कि यह फ़ंक्शन की घोषणा है जो कोई तर्क नहीं लेता है और एक MyObject उदाहरण देता है।

आप निर्माण के अधिक क्रियाशील तरीके का भी उपयोग कर सकते हैं:

 MyObject object1 = MyObject(); MyObject object2 = MyObject(object1); 

सी ++ 0x में यह auto : भी अनुमति देता है:

 auto object1 = MyObject(); auto object2 = MyObject(object1); 

मुझे लगता है, संकलक पता नहीं होगा कि यह कथन:

MyObject ऑब्जेक्ट ();

एक कन्स्ट्रक्टर कॉल या एक फ़ंक्शन प्रोटोटाइप है, जिसका नाम ऑब्जेक्ट नामित फ़ंक्शन को रिवर्स टाइप मायऑबैक्ट और कोई पैरामीटर नहीं है।

जैसा कि कई बार बताया गया है, यह एक घोषणा है। यह पिछड़े संगतता के लिए यही तरीका है सी ++ के कई क्षेत्रों में से एक है जो इसके विरासत के कारण नासमझ / असंगत / दर्दनाक / फर्जी है।

N4296 से [dcl.init]:

[ ध्यान दें:
चूंकि () आरंभीकरण के लिए वाक्यविन्यास द्वारा अनुमति नहीं है , X a(); वर्ग X के एक ऑब्जेक्ट की घोषणा नहीं है, लेकिन किसी फ़ंक्शन को कोई तर्क नहीं लेते हुए और एक्स वापस करने की घोषणा नहीं है। कुछ अन्य प्रारंभिक संदर्भ (5.3.4, 5.2.3, 12.6.2) में फ़ॉर्म () की अनुमति है।
-नोट नोट]

जैसा कि दूसरों ने कहा, यह एक फ़ंक्शन घोषणा है। सी ++ 11 के बाद से आप ब्रेस इनिशियलाइजेशन का उपयोग कर सकते हैं, अगर आपको खाली चीज़ देखने की आवश्यकता है जो स्पष्ट रूप से आपको बताती है कि एक डिफॉल्ट कन्स्ट्रक्टर का उपयोग किया जाता है।

 Jedi luke{}; //default constructor