2012-03-17 13 views
14

यह प्रश्न this answer द्वारा उठाए गए मुद्दों से आता है।संदर्भों के बजाय मूल्यों के साथ असाइनमेंट ऑपरेटर का संशोधन

आम तौर पर, हम परिभाषित असाइनमेंट ऑपरेटरों प्रकार T के लिए T& operator=(const T&) के रूप में प्रतिलिपि बनाएँ, और प्रकार T के लिए काम ऑपरेटरों के लिए कदम T& operator=(T&&) के रूप में।

हालांकि, जब हम किसी संदर्भ के बजाय मान पैरामीटर का उपयोग करते हैं तो क्या होता है?

class T 
{ 
public: 
    T& operator=(T t); 
}; 

यह टी दोनों प्रतिलिपि बनाने और आबंटित बढ़ना चाहिए। हालांकि, मैं क्या जानना चाहता हूं T के लिए भाषा रैमिकेशन क्या हैं?

विशेष रूप से: विनिर्देश के अनुसार T के लिए एक प्रति असाइनमेंट ऑपरेटर के रूप में इस गिनती,

  1. करता है?
  2. क्या यह विनिर्देश के अनुसार T के लिए एक चाल असाइनमेंट ऑपरेटर के रूप में गिना जाता है?
  3. T एक कंपाइलर से जेनरेट की गई प्रतिलिपि ऑपरेटर है?
  4. T एक कंपाइलर से उत्पन्न चाल असाइनमेंट ऑपरेटर होगा?
  5. यह std::is_move_assignable जैसे गुणों को प्रभावित करता है?
+0

संबंधित चर्चा: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value – mavam

+0

मुझे विजुअल स्टूडियो और जी ++ दोनों में कंपाइलर त्रुटियां मिलती हैं यदि मेरे पास कुछ टी एंड ऑपरेटर = (टी टी) और टी एंड ऑपरेटर = (टी एंड टी) क्योंकि यह संदिग्ध – user929404

+0

@ user929404 है: और आपको चाहिए। मुद्दा यह है कि आप * प्रति * प्रतिलिपि को प्रतिस्थापित करते हैं और केवल असाइनमेंट के साथ असाइनमेंट ले जाते हैं। –

उत्तर

14

इनमें से अधिकांश को §12.8 में वर्णित किया गया है। अनुच्छेद 17 क्या उपयोगकर्ता के घोषित प्रति असाइनमेंट ऑपरेटर के रूप में गिना जाता है परिभाषित करता है:

एक उपयोगकर्ता के घोषित प्रति असाइनमेंट ऑपरेटर X::operator= प्रकार X, X& के ठीक एक पैरामीटर के साथ वर्ग X के एक गैर स्थिर गैर टेम्पलेट सदस्य समारोह है, const X&, volatile X&, या const volatile X&

अनुच्छेद 19 क्या उपयोगकर्ता के घोषित चाल काम ऑपरेटर के रूप में गिना जाता है परिभाषित करता है:

एक उपयोगकर्ता के घोषित चाल असाइनमेंट ऑपरेटर X::operator= ठीक एक साथ वर्ग X के एक गैर स्थिर गैर टेम्पलेट सदस्य समारोह है पैरामीटर X&&, const X&&, volatile X&&, या const volatile X&& टाइप करें।

तो, यह एक कॉपी असाइनमेंट ऑपरेटर के रूप में गिना जाता है, लेकिन एक चाल असाइनमेंट ऑपरेटर के रूप में नहीं।

अनुच्छेद 18 कहता है जब संकलक प्रति असाइनमेंट ऑपरेटरों उत्पन्न करता है:

वर्ग परिभाषा स्पष्ट रूप से एक प्रति असाइनमेंट ऑपरेटर, एक परोक्ष घोषित किया जाता है की घोषणा नहीं करता है। यदि कक्षा परिभाषा एक चालक कन्स्ट्रक्टर या चाल असाइनमेंट ऑपरेटर घोषित करती है, तो निहित घोषित प्रति असाइनमेंट ऑपरेटर को हटाए गए के रूप में परिभाषित किया गया है; अन्यथा, यह को डिफ़ॉल्ट (8.4) के रूप में परिभाषित किया गया है।बाद का मामला बहिष्कृत किया गया है यदि कक्षा में उपयोगकर्ता द्वारा घोषित प्रतिलिपि निर्माता या उपयोगकर्ता द्वारा घोषित विनाशक है। जब संकलक ले जाने के काम ऑपरेटरों उत्पन्न

अनुच्छेद 20 हमें बताता है:

एक दसवीं कक्षा की परिभाषा को स्पष्ट रूप से एक कदम असाइनमेंट ऑपरेटर की घोषणा नहीं करता है, एक परोक्ष घोषित किया जाएगा यदि चूक के रूप में और केवल यदि
[...]
- एक्स एक उपयोगकर्ता के घोषित प्रति असाइनमेंट ऑपरेटर, नहीं है
[...]

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

std::is_copy_assignable और std::is_move_assignable क्रमशः is_assignable<T&,T const&>::value और is_assignable<T&,T&&>::value, के रूप में एक ही मूल्य होने के रूप में तालिका 49 में वर्णित हैं। यही कारण है कि तालिका हमें बताता है कि is_assignable<T,U>::valuetrue है जब:

अभिव्यक्ति declval<T>() = declval<U>() जब एक unevaluated संकार्य (खण्ड 5) के रूप में इलाज किया अच्छी तरह से गठित है। यदि T और U से संबंधित किसी संदर्भ में एक्सेस चेकिंग के रूप में की जाती है। केवल की वैधता असाइनमेंट अभिव्यक्ति के तत्काल संदर्भ पर विचार किया जाता है।

declval<T&>() = declval<T const&>() और declval<T&>() = declval<T&&>() दोनों के बाद से उस वर्ग के लिए अच्छी तरह से बनते हैं, यह अभी भी प्रति आबंटित रूप में गिना जाता है और आबंटित चलते हैं।

जैसा कि मैंने टिप्पणियों में उल्लेख किया है, इस बारे में उत्सुकता यह है कि, एक चालक कन्स्ट्रक्टर की उपस्थिति में, operator= सही ढंग से चाल निष्पादित करेगा, लेकिन तकनीकी रूप से एक चाल असाइनमेंट ऑपरेटर के रूप में नहीं गिना जाता है। यदि कक्षा में कोई कॉपी कन्स्ट्रक्टर नहीं है तो यह अजनबी भी है: इसमें एक कॉपी असाइनमेंट ऑपरेटर होगा जो प्रतियां नहीं करता है, लेकिन केवल चलता है।

संबंधित मुद्दे