यदि प्रति पर्याप्त रूप से महंगा है तो मैं वर्ग को हस्ताक्षर में गैर-प्रतिलिपि के रूप में मानूंगा। अर्थात् चीजें केवल तभी कॉपी की जा सकती हैं जब आप उन्हें बनना चाहते हैं, और एक महंगी प्रति "तय करने योग्य नहीं" तय करने का एक सभ्य कारण है।
कुछ कॉपी करने की क्षमता का मतलब यह नहीं है कि इसे कॉपी करने योग्य प्रकार में लागू किया जाना चाहिए। उस प्रकार के कार्यान्वयनकर्ता को यह तय करना पड़ता है कि क्या इसे अर्थात् प्रतिलिपि बनाना चाहिए।
मैं उस ऑपरेशन को नहीं बुलाऊंगा जिसने एक महंगी प्रति "प्रतिलिपि" बनाई, बल्कि "क्लोन" या "डुप्लिकेट" बनाई।
एक तरह से आप यह कर सकते हैं के लिए:
#include <utility>
template<typename T>
struct DoCopy {
T const& t;
DoCopy(T const& t_):t(t_) {}
};
template<typename T>
DoCopy<T> do_copy(T const& t) {
return t;
}
struct Foo {
struct ExpensiveToCopy {
int _[100000000];
};
ExpensiveToCopy* data;
Foo():data(new ExpensiveToCopy()) {}
~Foo(){ delete data; }
Foo(Foo&& o):data(o.data) { o.data = nullptr; }
Foo& operator=(Foo&& o) { data=o.data; o.data=nullptr; return *this; }
Foo& operator=(DoCopy<Foo> o) {
delete data;
if (o.t.data) {
data=new ExpensiveToCopy(*o.t.data);
} else {
data=new ExpensiveToCopy();
}
return *this;
}
Foo(DoCopy<Foo> cp):data(cp.t.data?new ExpensiveToCopy(*cp.t.data):new ExpensiveToCopy()) {};
};
int main() {
Foo one;
// Foo two = one; // illegal
Foo three = std::move(one); // legal
Foo four;
Foo five = do_copy(three);
four = std::move(three);
five = do_copy(four);
}
यह ऐसी तकनीकों के समान कमियां, अर्थात् के साथ, कुछ हद तक तरीकों से आप std::move
rvalue संदर्भ के अस्तित्व से पहले अर्थ विज्ञान की तरह लिखा जा सकता था के समान है कि भाषा को स्वयं ही पता नहीं है कि आप किस शेंगेनियन हैं।
यह लाभ यह है कि इसके बाद के संस्करण do_copy
की वाक्य रचना std::move
की वाक्य रचना के समान है है, और यह आप बिना पारंपरिक एक्सप्रेशन का उपयोग करने Foo
की तुच्छ उदाहरण बना करने के लिए फिर एक और चर आदि की एक प्रति का निर्माण की अनुमति देता है
यदि ऐसी स्थितियां जहां हम इसे कॉपी करने योग्य के रूप में पेश करना चाहते हैं, तो आम हैं (यदि टाला जाना है), तो मैं कक्षा के चारों ओर एक प्रति-रैपर लिखूंगा जो duplicate
विधि के बारे में जानता है।
मुझे लगता है कि 'कॉपी' सदस्य फ़ंक्शन के साथ समस्या यह है कि यह सभी टेम्पलेट कोड को तोड़ता है जो असाइनमेंट ऑपरेटर का उपयोग करता है। – Pubby