2012-08-03 21 views
6

सी ++ में कोई प्रतिलिपि कथन से कॉल नहीं किया जा सकता है क्योंकि मानक में एक विशेष खंड की वजह से एक कंपाइलर प्रतिलिपि बनाने वाले को कॉपी करने के लिए अनुमति देता है रिटर्न स्टेटमेंट, भले ही कॉपी कन्स्ट्रक्टर के साइड इफेक्ट्स हों। इस प्रकार, एक कॉपी कन्स्ट्रक्टर लिखना खराब शैली है जो इंस्टेंस बनाने की प्रतिलिपि बनाने की तुलना में कुछ और करता है।सी ++ 11 साइड इफेक्ट्स के साथ 11 चालक कन्स्ट्रक्टर

सी ++ 11 मानक है कि संकलक कुछ निश्चित परिस्थितियों में कदम निर्माता के लिए एक कॉल समाप्त करने के लिए अनुमति देते हैं में इसी तरह के बयान कर रहे हैं - और अगर ऐसा है, उन परिस्थितियों क्या हैं?

+0

धन्यवाद। प्रश्न पूरी हद तक जवाब दिया। आज बहुत कुछ सीख लिया! पहला (कुछ सेकंड तक) @Xeo था। यह सही जवाब होगा। सभी उत्तर +1 – ritter

उत्तर

9

कॉपी-इलिजन निर्माण स्थानांतरित करने के लिए सिर्फ एक ही लागू होता है, यह ठीक उसी खंड और दोनों प्रतिलिपि निर्माण की इलिजन है और निर्माण के लिए कदम सामूहिक रूप से कहा जाता है "कॉपी-इलिजन"।

§12.8 [class.copy] p31

जब कुछ मानदंडों को पूरा किया जाता है, एक कार्यान्वयन, एक वर्ग वस्तु की कॉपी/चाल निर्माण छोड़ करने की अनुमति दी है, भले ही कॉपी/चाल निर्माता और/या के लिए नाशक वस्तु दुष्प्रभाव है। [...]

3

जब प्रतिलिपि इलिजन अनुमति दी है, कोई प्रतिलिपि, प्रदर्शन किया जाएगा तो वहाँ कदम प्रतिलिपि निर्माता के लिए कोई कॉल हो जाएगा, भले ही वे चल रहा है। तो आगे बढ़ने पर elision जीतें, और यह निश्चित नहीं हो सकता है (कम से कम एक पोर्टेबल तरीके से नहीं) जब यह होगा। तो यह एक परिदृश्य है जब चाल प्रति निर्माण पर दुष्प्रभाव एक बुरा विचार होगा।

1

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