2012-06-18 26 views
7

मुझे पता है कि किसी ऑब्जेक्ट को किसी फ़ंक्शन के मान से गुजरते समय, चालक कन्स्ट्रक्टर को हमेशा एक कहा जाता है, यदि कोई है तो कोई प्रतिलिपि नहीं है। किसी वस्तु को मूल्य से वापस करने के बारे में क्या?क्या ऑब्जेक्ट लौटाए जाने पर स्थानांतरित होने की गारंटी है?

उदाहरण के लिए, हमारे पास कक्षा Foo है जिसमें एक चालक कन्स्ट्रक्टर है, और हमारे पास एक ऐसा फ़ंक्शन है जो Foo ऑब्जेक्ट देता है।

Foo g() { 
    Foo f; 

    // do something with f 

    return f; 
} 

अगर हमें लगता है कि कोई आरवीओ नहीं है, तो चालक कन्स्ट्रक्टर को कॉल करने की गारंटी है?

अद्यतन: मुझे लगता है कि मैंने अपना इरादा स्पष्ट रूप से नहीं दिखाया। मैं सिर्फ यह जानना चाहता हूं कि मैं सबसे खराब मामले में ऑब्जेक्ट कॉपी नहीं किया गया है। या तो आरवीओ या एनआरवीओ होता है, मैं खुश हूं। और मुझे यह भी कहना चाहिए कि चालक को स्थानांतरित करना और असाइनमेंट को स्थानांतरित नहीं किया गया है और ठीक से लागू किया गया है।

+0

हां, स्वचालित संग्रहण में स्थानीय वस्तुओं को पूर्ण रूप से वापसी विवरणों में xvalues ​​के रूप में माना जाता है। – ildjarn

+0

@ildjarn: मुझे लगता है कि यह केवल तभी होगा जब आप इसे सीधे वापस कर दें। एसओ पर कहीं मुझे यह कहने से सही किया गया कि यह फ़ंक्शन में 'f' स्थानांतरित हो गया है:' वापसी करें_ कुछ (एफ); '। – GManNickG

+0

@GManNickG: मेरे पास मानक या चेतावनी के लिए समय नहीं था, इसलिए उत्तर के बजाय एक टिप्पणी। मुझे लगता है कि आप सही हैं। : -] – ildjarn

उत्तर

4

हां। देखें [वर्ग।प्रतिलिपि] p32

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

+0

+1। – ildjarn

2

इस मामले में, क्योंकि वापसी मूल्य का नाम (f) है, यह एनआरवीओ (नामित वापसी मूल्य अनुकूलन) होगा जो लागू होगा।

तो, केवल तकनीकी शब्द पर आधारित तकनीकी उत्तर यह है कि आरवीओ की अनुपस्थिति प्रतिलिपि elision को रोक नहीं पाएगी, क्योंकि एनआरवीओ अभी भी इसे अनुमति दे सकता है।

पिछला, मुझे विश्वास है कि वापसी मूल्य की चाल/प्रति के बीच चयन फू की परिभाषा पर निर्भर करेगा/निर्भर करेगा - निश्चित रूप से इसे स्थानांतरित करने के बजाय कॉपी किया जाएगा, जैसे कि आपने स्पष्ट रूप से चालक कन्स्ट्रक्टर को हटा दिया गया है और असाइनमेंट ऑपरेटरों को ले जाया गया है, या आपने निर्माण/असाइनमेंट को परिभाषित नहीं किया है, और यह उनके लिए निहित रूप से संश्लेषित नहीं है।

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

जो भी हो रहा है, उसका उत्तर देने के लिए, सामान्य नियम यह है कि यदि संभव हो तो आगे बढ़ना होगा, और अगर यह कुछ नतीजे से निकलने से परिणाम को रोकता है तो यह कॉपी करने के लिए वापस आ जाएगा।

+0

मुझे लगता है कि मैंने इस सवाल में स्पष्ट रूप से अपना इरादा नहीं दिखाया। मैं सिर्फ यह जानना चाहता हूं कि मैं सबसे खराब मामले में ऑब्जेक्ट कॉपी नहीं किया गया है। या तो आरवीओ या एनआरवीओ होता है, मैं खुश हूं। और मुझे यह भी कहना चाहिए कि कन्स्ट्रक्टर को स्थानांतरित करना और असाइनमेंट को स्थानांतरित नहीं किया जाना चाहिए। धन्यवाद। – haotang

+3

@ जेरी: उस कोड में दो संभावित प्रतियां हैं। पहला स्थानीय चर से वापसी कथन तक है, जिसे आमतौर पर (एन) आरवीओ के रूप में जाना जाता है। यह गारंटी दी जाती है कि कोई चालक कन्स्ट्रक्टर नहीं है, तो संकलक (एन) आरवीओ लागू कर सकता है या नहीं, लेकिन अगर ऐसा नहीं होता है * इसे * निर्माण करना चाहिए। दूसरी संभावित प्रति कॉलर पक्ष पर, लौटे ऑब्जेक्ट से है, और यह प्रश्न के दायरे से बाहर होती है, क्योंकि यह कॉलर कोड पर निर्भर करती है, फ़ंक्शन पर नहीं। आवश्यक मानक उद्धरण के लिए –

1

नियम यह है कि जब भी प्रतिलिपि की अनुमति दी जाती है लेकिन ऐसा नहीं होता है, तो चालक का उपयोग तब किया जाएगा जब यह उपलब्ध हो, और अन्यथा कॉपी कन्स्ट्रक्टर का उपयोग किया जाएगा।

सही व्यवहार [class.copy]/32 द्वारा परिभाषित किया गया है:

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

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

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