इनमें से अधिकांश को §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>::value
true
है जब:
अभिव्यक्ति declval<T>() = declval<U>()
जब एक unevaluated संकार्य (खण्ड 5) के रूप में इलाज किया अच्छी तरह से गठित है। यदि T
और U
से संबंधित किसी संदर्भ में एक्सेस चेकिंग के रूप में की जाती है। केवल की वैधता असाइनमेंट अभिव्यक्ति के तत्काल संदर्भ पर विचार किया जाता है।
declval<T&>() = declval<T const&>()
और declval<T&>() = declval<T&&>()
दोनों के बाद से उस वर्ग के लिए अच्छी तरह से बनते हैं, यह अभी भी प्रति आबंटित रूप में गिना जाता है और आबंटित चलते हैं।
जैसा कि मैंने टिप्पणियों में उल्लेख किया है, इस बारे में उत्सुकता यह है कि, एक चालक कन्स्ट्रक्टर की उपस्थिति में, operator=
सही ढंग से चाल निष्पादित करेगा, लेकिन तकनीकी रूप से एक चाल असाइनमेंट ऑपरेटर के रूप में नहीं गिना जाता है। यदि कक्षा में कोई कॉपी कन्स्ट्रक्टर नहीं है तो यह अजनबी भी है: इसमें एक कॉपी असाइनमेंट ऑपरेटर होगा जो प्रतियां नहीं करता है, लेकिन केवल चलता है।
संबंधित चर्चा: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value – mavam
मुझे विजुअल स्टूडियो और जी ++ दोनों में कंपाइलर त्रुटियां मिलती हैं यदि मेरे पास कुछ टी एंड ऑपरेटर = (टी टी) और टी एंड ऑपरेटर = (टी एंड टी) क्योंकि यह संदिग्ध – user929404
@ user929404 है: और आपको चाहिए। मुद्दा यह है कि आप * प्रति * प्रतिलिपि को प्रतिस्थापित करते हैं और केवल असाइनमेंट के साथ असाइनमेंट ले जाते हैं। –