2016-06-06 10 views
8

मैं निम्नलिखित सदस्य समारोह है:वापसी मान के लिए प्रतिलिपि निर्माता होता है जब

Person ClassB::DoSomethingAndReturnPerson() 
{ 
RAIIMutex myLock(&m_mutex); 
return m_person; 
} 

RAIIMutex एक सहायक वर्ग है कि एक म्युटेक्स प्राप्त करता है और निर्माता और नाशक में विज्ञप्ति में यह ताले है।

m_personPerson (आकार में बहुत छोटा) है। अन्य धागे में अन्य कार्य इस सदस्य को बदल सकते हैं।

मैं मान द्वारा m_person वापस जाने के लिए चाहते हैं (एक प्रति वापसी) और निश्चित रूप से मैं स्थिति है जहाँ m_person एक और धागा में बदला जा रहा है जबकि यह बदले में कॉपी किया जा रहा है तो मैं ताला जोड़ दिया है बचना चाहते हैं।

लेकिन पहले क्या होता है? क्या संकलक पहले m_person की एक प्रति बनाता है या पहले myLock के विनाशक को कॉल करता है?

सैद्धांतिक रूप से यह easly कुछ इस तरह करने से व्याख्या करने योग्य:

Person ClassB::DoSomethingAndReturnPerson() 
{ 
RAIIMutex myLock(&m_mutex); 
Person tmp = m_person; 
return tmp; 
} 

लेकिन मैं अपने सवाल का जवाब जानने में दिलचस्पी रहा हूँ।

धन्यवाद

+0

[OT] आप 'साथ [' std :: lock_gurad'] (http://en.cppreference.com/w/cpp/thread/lock_guard) – NathanOliver

+1

प्रतिलिपि निर्माता नहीं कहा जा सकता है RAIIMutex' जगह ले सकता है बिलकुल भी, [कॉपी elision] के कारण (https://en.wikipedia.org/wiki/Copy_elision)। –

+1

@ जोचिमपिलबोर्ग यह संदिग्ध है क्योंकि 'm_person' एक वर्ग सदस्य परिवर्तनीय प्रतीत होता है। – NathanOliver

उत्तर

10

की कॉपी-प्रारंभ में विनिर्दिष्ट सिवाय इसके कि एक वर्ग वस्तु या उसके कॉपी/कदम समाप्त किया जा सकता है प्रकट होता है के रूप में समाप्त किया जा जाएगा लौटाया मूल्य पहले संसाधित किया जाएगा।

मानक से, $6.6.3/3 The return statement [stmt.return] (जोर मेरा)

लौटे संस्था की कॉपी-प्रारंभ पूर्ण अभिव्यक्ति के अंत के संकार्य द्वारा स्थापित किया गया पर temporaries की विनाश से पहले अनुक्रम है रिटर्न स्टेटमेंट, जो बदले में ब्लॉक के स्थानीय चर (6.6) के विनाश से पहले अनुक्रमित किया गया है, रिटर्न स्टेटमेंट संलग्न करता है।

+0

धन्यवाद, मैं मानक कहां पा सकता हूं? क्या यह मुफ्त में उपलब्ध है? – OopsUser

+0

@OopsUser आप देखना चाहते हैं [मुझे वर्तमान सी या सी ++ मानक दस्तावेज कहां मिलेंगे?] (Http://stackoverflow.com/questions/81656/where-do-i-find-the-current-c-or -सी-मानक-दस्तावेज), या [परिभाषित सी ++ पुस्तक गाइड और सूची] (http://stackoverflow.com/a/388282/3309790), मूल रूप से, [मानकीकरण से पहले अंतिम मसौदा] (http: // www। open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf) पर्याप्त (और निःशुल्क) से अधिक है। – songyuanyao

-1

स्थानीय वस्तुओं की Destructors 'अपने कोड की अंतिम पंक्ति' के बाद कहा जाता है। यहाँ स्टैंडर्ड से कोई प्रासंगिक उद्धरण (3.7.3/3) है:

स्वत: भंडारण अवधि के साथ एक चर प्रारंभ या साइड इफेक्ट के साथ एक नाशक है, यह के अंत से पहले नष्ट नहीं किया जाएगा इसके ब्लॉक, न ही यह एक अनुकूलन भले ही वह , अप्रयुक्त होने के लिए 12,8

+0

तो यह कॉपी कन्स्ट्रक्टर के पहले या बाद में होगा? कॉपी कन्स्ट्रक्टर मेरे कोड का हिस्सा नहीं है, संकलक इसे – OopsUser

+0

ओप्स यूसर को संभालता है, @ सोंग्युन्याओ द्वारा उत्तर भी बेहतर उद्धरण प्रदान करता है। कॉपी कन्स्ट्रक्टर के बाद, अगर इसे बिल्कुल कहा जाता है। – SergeyA

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