मैं अब निम्नलिखित प्रस्ताव से लड़ रहा हूं, और मैं कानूनी और कम से कम इसके लिए नैतिक तर्क और इसके लिए जानना चाहता हूं।आरवीओ/एनआरवीओ और सार्वजनिक अपरिभाषित प्रतिलिपि निर्माता
हम क्या था:
#include <vector>
class T;
class C
{
public:
C() { }
~C() { /*something non-trivial: say, calls delete for all elements in v*/ }
// a lot of member functions that modify C
// a lot of member functions that don't modify C
private:
C(C const &);
C& operator=(C const&);
private:
std::vector< T* > v;
};
void init(C& c) { } // cannot be moved inside C
// ...
int main()
{
// bad: two-phase initialization exposed to the clients
C c;
init(c);
// bad: here follows a lot of code that only wants read-only access to c
// but c cannot be declared const
}
क्या प्रस्तावित किया गया है:
#include <vector>
class T;
class C
{
public:
C() { }
~C() { /*calls delete for all elements in v*/ }
// MADE PUBLIC
C(C const &); // <-- NOT DEFINED
// a lot of member functions that modify C
// a lot of member functions that don't modify C
private:
C& operator=(C const&);
private:
vector< T* > v;
};
C init() // for whatever reason object CANNOT be allocated in free memory
{
C c;
// init c
return c;
}
// ...
int main()
{
C const & c = init();
}
यह संकलित करता है तथा लिंक (और काम करता है) हाल ही में जी का उपयोग कर ++ (जो केवल लक्षित संकलक है) दोनों 4.1.2 और 4.4.5 - (एन) आरवीओ की वजह से कॉपी-कन्स्ट्रक्टर कभी नहीं कहा जाता है; विनाशक केवल मुख्य() के अंत में बुलाया जाता है।
यह दावा किया जाता है कि तकनीक पूरी तरह से ठीक है, क्योंकि कॉपी-कन्स्ट्रक्टर का गलत इस्तेमाल नहीं किया जा सकता है (अगर इसे कभी भी जेनरेट किया गया है तो यह लिंकर त्रुटि होगी), और इसे सार्वजनिक करने के बारे में शिकायत करने के लिए संकलक को रोकता है निजी एक
यह वास्तव में मेरे लिए ऐसी चाल का उपयोग करने के लिए वास्तव में गलत लगता है, जो मुझे सी ++ भावना के विपरीत लगता है और शब्द की बुरी भावना में हैक की तरह दिखता है।
मेरी भावनाएं पर्याप्त तर्क नहीं है, इसलिए मैं अब तकनीकीताओं की तलाश में हूं।
कृपया पोस्ट न करें पाठ्यपुस्तक सी ++ यहां सामान:
- मैं की "तीन के नियम" के बारे में पता कर रहा हूँ और 12.8/15 और पवित्र स्टैंडर्ड के 12.2 के माध्यम से पढ़ा है;
- मैं न तो
vector<shared_ptr<T> >
और न हीptr_vector<T>
का उपयोग कर सकता हूं; - मैं
C
को मुफ्त मेमोरी में आवंटित नहीं कर सकता और इसेinit
सेC*
के माध्यम से वापस कर सकता हूं।
धन्यवाद।
मुझे लगता है कि हिल निर्माण आपके लिए एक संभावना नहीं है? –
@ कोनराड रुडॉल्फ: दुर्भाग्य से नहीं (g ++ 4.1.2 उन कंपाइलरों में से एक है जिन्हें हमें समर्थन देना चाहिए, इस प्रकार कोई 0x विशेषताएं नहीं)। –
"इसे सार्वजनिक बनाने के बारे में शिकायत करने के लिए बेवकूफ संकलक को रोकता है।" - बेवकूफ संकलक नहीं। मानक की आवश्यकता है कि कॉपी कन्स्ट्रक्टर पहुंच योग्य है भले ही प्रतिलिपि बनाई गई हो, क्योंकि प्रतिलिपि elision वैकल्पिक है। इसलिए यदि इसे निजी होने की अनुमति दी गई तो एक प्रोग्राम जो किसी त्रुटि से बचने के लिए elision पर निर्भर करता है, वैसे भी सख्ती से अनुरूप नहीं होगा, और इस मामले में मानक को निदान की आवश्यकता होती है। संकलक पोर्टेबल कोड लिखने में आपकी मदद कर रहा है, स्वीकार्य रूप से आपकी इच्छाओं के विरुद्ध ;-) –