2017-08-18 10 views
6
#include <iostream> 

struct Box 
{ 
    Box()   { std::cout << "constructor called" << std::endl; } 
    Box(const Box&) { std::cout << "Copy constructor called" << std::endl; } 
    Box(Box&&)  { std::cout << "Move constructor called" << std::endl; } 
    void run() const { std::cout << "Run" << std::endl;} 
}; 

int main() 
{ 
    Box a(Box()); 
    a.run(); 
} 

(demo) के रूप में बेनामी वस्तु गुजरकोई भी तर्क

ऊपर कोड मैं उम्मीद कर रहा था में पर कहा जाता है या तो Copy Constuctor या Move Constructor तर्क के रूप में गुमनाम वस्तु Box() गुजर पर कहा जाता है। लेकिन उनमें से कोई भी नहीं बुलाया गया था। कारण शायद copy elision हो सकता है। लेकिन अज्ञात ऑब्जेक्ट A() के लिए भी कन्स्ट्रक्टर नहीं कहा जाता है। दरअसल, उपर्युक्त कोड संकलित नहीं होता है और run() पर कॉल करने पर फ़ंक्शन कंपाइलर ने निम्न त्रुटि दी है।

a.cpp: In function ‘int main()’: 
a.cpp:28:7: error: request for member ‘run’ in ‘a’, which is of non-class type ‘Box(Box (*)())’ 
    a.run(); 

तो जब हम टाइप Box a(Box()) क्या हो रहा है? क्या बनाया जा रहा है?

+3

आपको एमवीपी द्वारा काटा गया है। यह 'बॉक्स ए (बॉक्स()) सोचता है; '''' नामक एक फ़ंक्शन की घोषणा' बॉक्स 'लौटा रही है। – Borgleader

+0

@YSC मुझे यकीन नहीं है कि मैं आपके स्वरूपण से सहमत हूं - मैंने पिछले संस्करण को प्राथमिकता दी थी। – pingul

+1

@pingul छोटे कोड SO पर अधिक ध्यान आकर्षित करते हैं, और मेरा संपादन ओपी के मूल उद्देश्य को बदलने की उम्मीद नहीं करता है। लेकिन यह निश्चित रूप से इसे रोलबैक करने के लिए उनकी कॉल। – YSC

उत्तर

15

यह Most Vexing Parse का मामला है। जब किसी फ़ंक्शन घोषणा के रूप में कुछ पार्स किया जा सकता है, तो यह है।

Box a(Box()) 

a नामित तर्क के रूप में प्रकार Box (*)() के एक समारोह ले रहे हैं और एक Box वाला फ़ंक्शन की घोषणा है।

एक समाधान का उपयोग करने के लिए है (में नए सी ++ 11) aggregate initialization अपने वस्तुओं के निर्माण के लिए:

Box a{Box{}} 

(demo)


एमवीपी में अपने सरलतम रूप में चर्चा की है यह stackoverflow सवाल Most vexing parse: why doesn't A a(()); work?

यदि आपके भीतर कोई अभिव्यक्ति है तो यह यह सही है। उदाहरण के लिए:

((0));//compiles 

कैसे भाषाओं परिभाषित कर रहे हैं के बारे में अधिक जानने के लिए, और कैसे compilers काम करते हैं, आप परिमित अवस्था की मशीनों के बारे में Formal language theory या अधिक विशेष रूप Context Free Grammars (CFG) और संबंधित सामग्री सीखना चाहिए। यदि आप इसमें रुचि रखते हैं हालांकि विकिपीडिया पेज पर्याप्त नहीं होंगे, तो आपको एक पुस्तक प्राप्त करनी होगी।

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