कई स्थानों में मैं कॉपी और चाल निर्माताओं की सिफारिश हस्ताक्षर के रूप में दिया देखा है:क्या एक चालक कन्स्ट्रक्टर एक कॉन्स या गैर-कॉन्स रावल्यू संदर्भ लेना चाहिए?
struct T
{
T();
T(const T& other);
T(T&& other);
};
कहाँ प्रतिलिपि निर्माता एक स्थिरांक संदर्भ लेता है, और इस कदम निर्माता एक गैर स्थिरांक rvalue संदर्भ लेता है।
जहां तक मेरा हालांकि देख सकते हैं, यह मेरे इस कदम अर्थ विज्ञान का लाभ लेने जब इस तरह के नीचे मामले में एक समारोह से स्थिरांक वस्तुओं, लौटने से बचाता है:
T generate_t()
{
const T t;
return t;
}
परीक्षण इस VC11 बीटा के साथ, T
' एस कॉपी कन्स्ट्रक्टर कहा जाता है, और चालक कन्स्ट्रक्टर नहीं। यहां तक कि return std::move(t);
का उपयोग कर कॉपी कन्स्ट्रक्टर अभी भी कहा जाता है।
मैं देख सकता हूं कि यह कैसे समझ में आता है, क्योंकि t
है इसलिए T&&
से बंधना नहीं चाहिए। कन्स्ट्रक्टर हस्ताक्षर में const T&&
का उपयोग करना ठीक काम करता है, और समझ में आता है, लेकिन फिर आपको समस्या है क्योंकि other
कॉन्स है, यदि आप बाहर निकलने की आवश्यकता है तो आप अपने सदस्यों को बाहर नहीं कर सकते हैं - यह केवल तभी काम करेगा जब सभी सदस्य स्केलर हैं या सही हस्ताक्षर के साथ रचनाकारों को स्थानांतरित कर चुके हैं।
यह सुनिश्चित करने का एकमात्र तरीका है कि सामान्य मामले में चलने वाले कन्स्ट्रक्टर को पहले स्थान पर t
गैर-कॉन्स बनाने के लिए कहा जाता है, लेकिन मुझे ऐसा करना अच्छा नहीं लगता - चीजें बनाना अच्छा रूप है और मैं T
के क्लाइंट की अपेक्षा नहीं करेगा कि उन्हें प्रदर्शन बढ़ाने के लिए उस फ़ॉर्म के खिलाफ जाना होगा।
तो, मुझे लगता है कि मेरा प्रश्न दो गुना है; सबसे पहले, एक चालक कन्स्ट्रक्टर एक कॉन्स या गैर-कॉन्स रैवल्यू संदर्भ लेना चाहिए? और दूसरा: क्या मैं तर्क के इस पंक्ति में सही हूँ? मुझे उन चीज़ों को वापस करना बंद करना चाहिए जो स्थिर हैं?
ठीक है, मुझे लगता है कि लौटने वाले स्थिर अस्थायी के उपयोग के मामले कुछ हद तक छोटे हैं। यदि आप इसे पहले से घोषित करते हैं, तो आप लौटने से पहले कुछ चीजें करना चाहते हैं। यदि नहीं, तो एक सरल 'वापसी टी() 'वैसे भी करेगा। हालांकि मैं अभी भी कुछ उपयोग मामलों को देख सकता हूं, मुझे लगता है कि वे दुर्लभ हैं। और निश्चित रूप से, एक रावल्यू संदर्भ जिसमें से आप संसाधनों को चुरा नहीं सकते हैं, वास्तव में किसी लाल्व संदर्भ की तुलना में किसी भी मूल्य का नहीं है। इंटरस्टेस्टिंग सवाल, यद्यपि। –
वैसे, क्या यह कोड एनआरवीओ के लिए योग्य नहीं है? तो "क्या होना चाहिए" यह है कि 'कॉन्स्ट' ऑब्जेक्ट 'टी' गैर-कॉन्स रिटर्न मान के समान स्थान पर बनाया गया है। फिर यदि आवश्यक हो तो गैर-कॉन्स रिटर्न वैल्यू * को कॉलर द्वारा गैर-कॉन्स मूव कन्स्ट्रक्टर (या एक मूव असाइनमेंट ऑपरेटर) के माध्यम से स्थानांतरित किया जा सकता है। निर्माण के मामले में, फिर भी यह प्रतिलिपि elision के लिए योग्य होगा और 'gener_t()' पर कॉल का उपयोग करके जो कुछ भी शुरू किया जा रहा है उसे सीधे बनाया जा सकता है। इस अनुकूलन को बनाने से वीसी 11 में क्या बाधा आ रही है? –
_consting चीजें अच्छी फॉर्म_ नहीं है अगर आप उन्हें संशोधित करना चाहते हैं, उदा। उनसे आगे बढ़कर। –