c++ - why does vector.emplace_back call the move-constructor? -


  स्ट्रक्चर ऑब्जेक्ट {ऑब्जेक्ट () {cout & lt; & lt; "निर्माता \ n"; } ऑब्जेक्ट (const वस्तु & amp;) {cout & lt; & lt; "प्रतिलिपि कन्स्ट्रक्टर \ n"; } ऑब्जेक्ट (ऑब्जेक्ट & amp;) {cout & lt; & lt; "कंसट्रक्टर को स्थानांतरित करें \ n"; }}; Int main () {वेक्टर & lt; ऑब्जेक्ट & gt; v; v.reserve (10); v.emplace_back (वस्तु {}); }  

यह मुझे निम्नलिखित आउटपुट देता है:

कन्स्ट्रक्टर / चाल निर्माता

क्यों? मैंने सोचा था कि ऑब्जेक्ट को जगह बना देता है, ताकि कोई प्रतिलिपि या कंसल्टेंटर्स को बुलाया जाए।
विवरण से:

तत्व इन-प्लेस का निर्माण होता है, अर्थात कोई प्रतिलिपि नहीं है

संपादित करें: आह, ठीक है, ऐसा लगता है कि मैं मौलिक रूप से emplace_back () को गलत समझाता हूं। आपको ऑब्जेक्ट को एक तर्क के रूप में नहीं रखना पड़ता है, क्योंकि यह स्वचालित रूप से आपके लिए जगह बना हुआ है। आपको केवल ऑब्जेक्ट-कंस्ट्रक्टर के लिए एप्लीकेशन_बैक () के लिए तर्क देना होगा।

अतः, अगर मेरे पास इस तरह एक नया कन्स्ट्रक्टर था:

  ऑब्जेक्ट (इंट) { Cout & lt; & lt; "इंटी कंस्ट्रक्टर \ n"; }  

मैं इस तरह रिक्त स्थान को कॉल करूंगा:

  v.emplace_back (42); इसके बजाय  

:

  v.emplace_back (ऑब्जेक्ट (42));  

समझ आता है, बहुत बहुत धन्यवाद!

EDIT2: मुझे लगता है कि मैं आपके सभी उत्तरों को स्वीकार कर सकता हूं! : -पी

emplace_back इसके तर्कों को वेक्टर तत्व के निर्माता के लिए आगे ले जाता है वेक्टर

  v.emplace_back (ऑब्जेक्ट {}) की अगली उपलब्ध स्थिति पर इन्हें कहा जाता है;  

समान है:

  {ऑब्जेक्ट टीएमपी; v.emplace_back (std :: चाल (tmp)); }  

यही कारण है कि आप एक चालक कंसट्रक्टर कॉल के बाद एक नियमित कन्स्ट्रक्टर कॉल प्राप्त कर रहे हैं। यदि आप emplace_back के साथ एक नई ऑब्जेक्ट जोड़ना चाहते हैं, तो बस कॉल करें:

  v.emplace_back ();  

बस पूर्णता के लिए, एक और कारण क्यों emplace_back एक चालन निर्माता को कह सकता है: emplace_back के कारण हो सकता है वेक्टर बढ़ने के लिए, और इस प्रकार अपनी प्रारंभिक सामग्री को अपनी नई स्मृति स्थान पर स्थानांतरित कर रहा है यह यहां समस्या नहीं है, क्योंकि आरक्षित को पर्याप्त क्षमता की गारंटी देता है, लेकिन आम तौर पर यह प्रश्न का उत्तर है।


Comments