c++ - vector::push_back and std::move -
इस सवाल का पहले से ही एक उत्तर है: < / P>
- 4 जवाब
मैंने निम्नलिखित कोड की कोशिश की:
<पूर्व> #include & lt; iostream & gt; संरचना परीक्षण {परीक्षण () {} परीक्षा (परीक्षण संधि & amp;) {std :: cout & lt; & lt; __ लाइन __ & lt; & lt; "\ n"; } परीक्षा (परीक्षण एवं amp;) {std :: cout & lt; & lt; __ लाइन __ & lt; & lt; "\ n"; }}; #include & lt; vector & gt; # शामिल करें & lt; उपयोगिता & gt; // std :: move int main () {ऑटो & amp; amp; Tmp = test (); std :: वेक्टर & LT; परीक्षण & gt; v; v.push_back (tmp); std :: अदालत के & lt; & lt; __ लाइन __ & lt; & lt; "\ n"; v.push_back (std :: चाल (tmp)); वापसी 0; }
बनाम -2013 कंपाइलर आउटपुट:
6 // copy
18
9 // चाल
9 / /
9 //
6 // कॉपी करें
मेरी समस्याएं हैं:
-
क्या टीएमपी परीक्षण और amp; amp ;? क्या टीएमपी एक रैवल्यू है?
-
अगर टीएमपी का प्रकार परीक्षण है & amp ;, तो पहले पुश_बैक का उपयोग चालक कंसट्रक्टर क्यों नहीं किया गया?
< Li>
अंतिम आउटपुट कहां से आया था? क्यों बनाम 2013 और जी ++ आउटपुट अलग-अलग परिणाम क्यों करते थे?
धन्यवाद।
तीसरी समस्या के उत्तर: एंड्रयू.punnett द्वारा टिप्पणी के रूप में यह पुनर्वित्त से आता है।
प्रकार
tmp
परीक्षण है & amp; amp; ;
?
हाँ और नहीं टीएमपी
एक प्रकार की रैवल्यू संदर्भ चर प्रकार परीक्षण और amp; amp;
है, लेकिन पहचानकर्ता tmp
एक अभिव्यक्ति के रूप में लिया गया test और मूल्य श्रेणी लावल्यू
& amp;
कभी भी अभिव्यक्ति के प्रकार का हिस्सा नहीं है।
क्या
tmp
एक rvalue?
नहीं। पहचानकर्ता का कोई भी उपयोग एक लावल्यू अभिव्यक्ति है, यहां तक कि किसी रैवल्यू संदर्भ का नाम भी। रैवल्यू रेफरेंस वेरिएबल्स मूल रूप से समान रूप से लावल्यू संदर्भ चर तक पहुंच जाते हैं; केवल विकीप्लेपी (टीएमपी)
अंतर को बता सकता है (अक्सर आप decltype ((टीएमपी))
से से बचने अंतर को बताएंगे।)
यदि टीएमपी का प्रकार परीक्षण है & amp; & Amp ;, क्यों पहली push_back उपयोग चाल निर्माता नहीं किया?
क्योंकि एक rvalue संदर्भ का नाम अभी भी एक lvalue है एक रैवल्यू अभिव्यक्ति प्राप्त करने के लिए, move (tmp)
का उपयोग करें।
अंतिम आउटपुट कहां से आया था? क्यों बनाम 2013 और जी + उत्पादन अलग-अलग परिणामों में था?
नाराज़गी और जीसीसी ने केवल <ऑब्जेक्ट के लिए vector
में एक ऑब्जेक्ट बनाया है जब आप दूसरी ऑब्जेक्ट को जोड़ते हैं, तो वेक्टर स्टोरेज को पुन: निर्दिष्ट किया जाता है जिससे वस्तुओं को कॉपी किया जा सकता है। वे क्यों नहीं चले गए? चूंकि चालन निर्माता नहीं है बिना एक्सपैंट
, इसलिए यदि यह एक अपवाद फेंकता है, तो reallocation को वापस करना असंभव होगा।
MSVC द्वारा दो चाल के लिए, दो संभावनाएं हैं , जिसे आप प्रयोग से अलग कर सकते हैं - मेरे पास कोई प्रतिलिपि आसान नहीं है।
- वेक्टर के अंदर एमएसवीसी को दो ऑब्जेक्ट्स के लिए डिफॉल्ट द्वारा पर्याप्त स्पेस आरक्षित है दूसरी चाल एक आंतरिक स्थानीय वैरिएबल से है।
- एमएसवीसी ने उस आवेश को नजरअंदाज किया है, जिसमे चालक कंसट्रक्टर
कोई एक्सएसेस्ट नहीं होगा और इसे किसी भी तरह से स्थानांतरित करने के लिए कहा जाएगा। यह एक बग होगा, लेकिन इस मामले में यह एक आम गलती को कवर कर रहा है।
यदि आप
vector
कोdeque
के साथ बदलते हैं, तो आप किसी भी अधिक प्रतियां नहीं देख पाएंगे, क्योंकिडेक
को कॉपी करने की अनुमति देने की अनुमति नहीं है।
Comments
Post a Comment