सरल उत्तर है: हाँ।
कारण या तो आप (एक अस्थायी से) ले जाने के लिए या (एक एल-मूल्य से) एक प्रतिलिपि बनाने की आवश्यकता हो सकती है अगर आप मान द्वारा की दुकान है, साथ ही काफी सरल है। आइए जांच करें कि दोनों स्थितियों में दोनों स्थितियों में क्या होता है।
एक अस्थायी
- से यदि आप स्थिरांक-रेफरी द्वारा तर्क लेते हैं, अस्थायी स्थिरांक-रेफरी के लिए बाध्य है और फिर से ले जाया जा सकता है, इस प्रकार आप अंत एक (बेकार) बनाने प्रति।
- यदि आप मूल्य से तर्क लेते हैं, तो मूल्य अस्थायी (चलती) से प्रारंभ होता है, और फिर आप स्वयं तर्क से आगे बढ़ते हैं, इस प्रकार कोई प्रतिलिपि नहीं बनाई जाती है।
एक सीमा: एक कुशल चालक-निर्माता (जैसे std::array<T, N>
) के बिना एक वर्ग क्योंकि तब आपने एक की बजाय दो प्रतियां की थीं।
एक एल-मूल्य से (या स्थिरांक अस्थायी है, लेकिन जो कि क्या करना होगा ...)
- अगर आप स्थिरांक-रेफरी द्वारा तर्क लेते हैं, कोई बात नहीं होता है, और उसके बाद आप इसे कॉपी (इससे आगे नहीं बढ़ सकता), इस प्रकार एक प्रतिलिपि बनाई जाती है।
- यदि आप मूल्य से तर्क लेते हैं, तो आप इसे तर्क में कॉपी करते हैं और फिर उससे आगे बढ़ते हैं, इस प्रकार एक प्रतिलिपि बनाई जाती है।
एक सीमा: वही ... कक्षाएं जिसके लिए चलती है प्रतिलिपि बनाने के समान है।
तो, सरल जवाब यह है कि ज्यादातर मामलों में, एक सिंक का उपयोग करके आप अनावश्यक प्रतियों से बचते हैं (उन्हें चाल से बदलते हैं)।
एकल सीमा कक्षाएं है जिसके लिए चालक कन्स्ट्रक्टर प्रतिलिपि के रूप में महंगा (या महंगी के रूप में) है; जिस मामले में एक प्रतिलिपि के बजाय दो चालें होती हैं वह "सबसे खराब" होती है। शुक्र है, इस तरह के वर्ग दुर्लभ हैं (सरणी एक मामले हैं)।
स्रोत
2013-09-07 13:30:30
वह दावा मेरे लिए संदिग्ध लगता है। 'कॉन्स्ट एंड' द्वारा पास करना और फिर प्रारंभ करना एक प्रतिलिपि कन्स्ट्रक्टर को कॉल करेगा। मूल्य और आगे बढ़ने से एक कॉपी कन्स्ट्रक्टर को एक चाल असाइनमेंट ऑपरेटर के बाद कॉल किया जाएगा। – Yuushi
@ युसुशी: सामान्यतः, अधिकांश वर्गों का चालक कन्स्ट्रक्टर लगभग मुफ़्त है (एक स्वैप के बराबर)। साथ ही, आप उन मामलों को भूल रहे हैं जहां आप अस्थायी (या एक स्थानांतरित चर से) तर्क को प्रारंभ करते हैं। –
@MatthieuM। मुझे एहसास है कि चालक कन्स्ट्रक्टर आमतौर पर लगभग मुफ्त है। हालांकि, यदि आप परिवर्तनीय से अस्थायी/स्थानांतरित हो रहे हैं, तो इसे स्पष्ट रूप से एक रावल्यू संदर्भ लेने के लिए क्यों न घोषित करें? – Yuushi