मैं किसी फ़ंक्शन से Foo
प्रकार की एक गैर-लोकप्रिय वस्तु वापस करना चाहता हूं। यह मूल रूप से एक सहायक वस्तु है जिसे कॉलर क्रियाओं का एक सेट करने के लिए उपयोग करेगा, कार्यकर्ता पूर्ण होने के बाद कुछ सफाई करने के लिए एक विनाशक के साथ।क्या यह केवल एक चालक कन्स्ट्रक्टर प्रदान करने के लिए खराब फॉर्म है?
rvalue references के आगमन से पहले, मैं shared_ptr<Foo>
या कुछ ऐसा ही लौटा देता। रैवल्यू संदर्भों के साथ, एक और विकल्प कन्स्ट्रक्टर बनाने और प्रतिलिपि बनाने वाले निजी को बनाना होगा, और एकमात्र सार्वजनिक कन्स्ट्रक्टर एक चालक कन्स्ट्रक्टर होगा। Foo
कुछ इस तरह दिखेगा:
class Foo : boost::noncopyable
{
private:
Foo(/* whatever the real ctor needs */);
public:
Foo(Foo && src);
// ... interesting stuff ...
};
Foo a(SomethingThatReturnsFoo()); // allowed
Foo b; // error, no public default constructor
Foo c(a); // error, noncopyable
Foo d = a; // error, noncopyable
मेरा प्रश्न है कि क्या यह बुरा रूप यह करने के लिए किया जाएगा है, या यह उचित लग रहा है या नहीं। मैं किसी भी कारण से नहीं सोच सकता कि इससे मुद्दों का कारण बनना मुश्किल हो सकता है या पढ़ना मुश्किल हो सकता है, लेकिन जब भी रावल संदर्भों की बात आती है, तब भी मैं कुछ हद तक नौसिखिया हूं, इसलिए ऐसे विचार हो सकते हैं जिनके बारे में मैं सोच नहीं रहा हूं।
मामूली टिप्पणी: यदि आप 'मूव कन्स्ट्रक्टर' प्रदान करते हैं, तो लोग शायद 'मूव असाइनमेंट ऑपरेटर' की भी उम्मीद करेंगे। क्या आप इसे उपलब्ध कराने की योजना बना रहे हैं, या आप एक अपरिवर्तनीय वर्ग चाहते हैं? –
इस विशेष मामले में यह अपरिवर्तनीय होने का इरादा है, इसलिए मुझे असाइनमेंट नहीं चाहिए, लेकिन यह सामान्य रूप से एक अच्छा बिंदु है। – Charlie
बीटीडब्ल्यू, कंपाइलर से उत्पन्न प्रतिलिपि/चाल संचालन विभाग में हुए हालिया परिवर्तनों के साथ, आपको वास्तव में बूस्ट :: noncopyable से प्राप्त करने की आवश्यकता नहीं है। एक चालक कन्स्ट्रक्टर घोषित करने से पहले किसी भी अन्य प्रतिलिपि/चालन संचालन को उत्पन्न करने से संकलक को रोका जा सकता है, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3203.htm – sellibitze