2012-06-28 15 views
18

द्वारा std :: vector पर लौटने पर अक्सर यह कहा जाता है कि सी ++ में यह std::vector मूल्य से वापस करने के लिए sane है।मूल्य

सी ++ 03 में यह ज्यादातर सच था क्योंकि आरवीओ को प्रतिलिपि को अनुकूलित करना चाहिए। लेकिन अधिकतर डेवलपर्स को डरा दिया जाना चाहिए।

  • सी ++ में वापस लौटाएगा std::vector स्थानीय चर हमेशा स्थानांतरित हो जाएगा?
  • क्या होगा यदि वह वेक्टर स्थानीय चर के बजाय स्थानीय चर का सदस्य है?
  • स्पष्ट रूप से एक वैश्विक चर लौटने को स्थानांतरित नहीं किया जाएगा। अन्य मामलों को क्यों नहीं ले जाया जाएगा?
+0

यह भी देखें [यह प्रश्न] (http://stackoverflow.com/q/9532608/500104)। – Xeo

उत्तर

15

सबसे पहले, हर बार एक प्रतिलिपि पहले से elided किया जा सकता है, यह अभी भी elided किया जा सकता है, और चालें एक ही परिस्थितियों में elided किया जा सकता है। इस पोस्ट के बाकी हिस्सों के लिए मैं मानता हूं कि किसी कारण से elision नहीं होता है (संकलक लेखक का बुरा तरीका खराब तरीके से आलसी था)।

सी ++ 11 में एक लौटा हुआ std :: वेक्टर स्थानीय चर हमेशा स्थानांतरित हो जाएगा?

प्रत्येक बार प्रतिलिपि elision के मानदंडों को पूरा किया जाता है, या चर स्पष्ट रूप से std::move डी है।

क्या होगा यदि वेक्टर स्थानीय चर के बजाय स्थानीय चर का सदस्य है?

यह स्पष्ट रूप से std::move डी तक तब तक नहीं ले जाया जाएगा।

स्पष्ट रूप से वैश्विक चर लौटने को स्थानांतरित नहीं किया जाएगा। अन्य मामलों को क्यों नहीं ले जाया जाएगा?

प्रत्येक बार प्रतिलिपि elision के मानदंडों को पूरा नहीं किया जाता है और चर स्पष्ट रूप से std::move डी नहीं है।

उनमें से कोई भी मूल्य से वापस नहीं लौटने का एक वैध कारण है। मूल्य से वापसी ठीक है, क्योंकि जब मान स्वचालित रूप से स्थानांतरित नहीं होता है तब भी आप इसे std::move से मजबूर कर सकते हैं।

+0

मुझे नहीं लगता कि इसे स्थानांतरित किया जाएगा यदि इसे आरवीओ किया जा सकता है। – juanchopanza

+0

@juanchopanza अच्छी तरह से, हाँ, इनमें से कोई भी अनुकूलन को रोकता है। –

+0

ठीक है; आपका पहला बिंदु यह इंगित करता है कि प्रतिलिपि elision के मानदंडों को पूरा करने के लिए हर बार ** ** स्थानांतरित किया जाएगा। – juanchopanza

8

सी ++ में वापस लौटाएगा std::vector स्थानीय चर हमेशा स्थानांतरित हो जाएगा?

एक स्थानीय चर के लिए, यहां तक ​​कि एक उप-मूल्य पैरामीटर, संकलक, हमेशा प्रयास यह पहली बार स्थानांतरित करने के लिए (यदि न चाल है और न ही प्रतिलिपि जो भी कारण के लिए elided किया जा सकता है मानदंड हैं, भले ही मिला)। अगर यह काम नहीं है, यह एक प्रति के साथ फिर से कोशिश करता है:

§12.8 [class.copy] p32

जब एक प्रतिलिपि आपरेशन के इलिजन के लिए मानदंडों को पूरा कर रहे हैं या तथ्य यह है कि स्रोत ऑब्जेक्ट एक समारोह पैरामीटर है के लिए सेव पूरी की जाएगी, और प्रतिलिपि बनाने वाली ऑब्जेक्ट को प्रतिलिपि के लिए कन्स्ट्रक्टर का चयन करने के लिए एक लवल्यू, ओवरलोड रिज़ॉल्यूशन द्वारा नामित किया गया है, जैसा कि ऑब्जेक्ट को एक रावल्यू द्वारा निर्दिष्ट किया गया था।यदि ओवरलोड रिज़ॉल्यूशन विफल रहता है, या यदि चयनित कन्स्ट्रक्टर के पहले पैरामीटर का प्रकार ऑब्जेक्ट के प्रकार (संभावित रूप से सीवी-क्वालिफाइड) के लिए एक रावल्यू संदर्भ नहीं है, तो ऑब्जेक्ट को एक लवल्यू के रूप में देखते हुए ओवरलोड रिज़ॉल्यूशन फिर से किया जाता है। [नोट: इस दो चरण के अधिभार रिज़ॉल्यूशन को निष्पादित किया जाना चाहिए चाहे कॉपी प्रतिलिपि हो। यह कथन को निर्धारित करने के लिए कन्स्ट्रक्टर को निर्धारित करता है, और कॉल का विस्तार होने पर भी चयनित कन्स्ट्रक्टर को सुलभ होना चाहिए। -end नोट]

क्या होगा यदि वेक्टर स्थानीय चर के बजाय स्थानीय चर का सदस्य है?

एक सबोबजेक्ट को स्थानांतरित करने की कोशिश नहीं की जाएगी, क्योंकि यह कॉपी एलिशन के मानदंडों को पूरा नहीं करता है। (जो गूंगा, IMHO, लेकिन वह यह कैसे वर्तमान में है। मुझे नहीं लगता कि दो जोड़ा जाना चाहिए, के बाद से एक subobject बिल्कुल ठीक है अगर यह स्थानीय है ले जाया जा सकता है।)

जाहिर है एक वैश्विक चर लौटने

होगा स्थानांतरित नहीं किया जा सकता है। अन्य मामलों को क्यों नहीं ले जाया जाएगा?

एक संदर्भ स्पष्ट रूप से स्थानांतरित नहीं किया जाएगा। इसके अलावा, मैं वास्तव में किसी और चीज के बारे में सोच नहीं सकता।

+0

स्थानीय के संदर्भ के बारे में क्या? यदि स्थानीय रेफरी पर 'std :: move' कहा जाता है तो क्या होगा? –

+0

@deft_code: एक संदर्भ स्वयं स्वचालित रूप से स्थानांतरित नहीं किया जाएगा, ऐसा लगता है कि मेरी अंतिम वाक्य उस संबंध में पर्याप्त स्पष्ट नहीं थी। एक 'std :: move''d संदर्भ निर्दिष्ट-टू ऑब्जेक्ट को स्थानांतरित करेगा। – Xeo