सारांश
चाल सदस्यों को न हटाएं।
मान लिया जाये कि आपके संकलक पूरी तरह से सी ++ 11 अनुरूप है, तो स्पष्ट रूप से इस कदम निर्माता हटाने पर परोक्ष निम्नलिखित घोषणा करेंगे है:
Foo(const Foo&) = delete;
Foo& operator=(const Foo&) = delete;
कि अगर है कि आप एक कदम निर्माता की घोषणा (या असाइनमेंट ऑपरेटर ले जाएं), और प्रतिलिपि सदस्यों की घोषणा न करें, उन्हें पूरी तरह से हटाए जाने के रूप में घोषित किया जाता है।
class Foo
{
public:
Foo(int i) : i_(i) {}
Foo(Foo&&) = delete;
Foo(const Foo&) = delete; // implicitly declared
Foo& operator=(const Foo&) = delete; // implicitly declared
int i_;
};
अब vector<Foo>::push_back(Foo(1))
की आवश्यकता है कि Foo
MoveConstructible
हो: तो अपना पूरा वर्ग फू के रूप में अगर है। MoveConstructible
एक सुलभ चालक कन्स्ट्रक्टर द्वारा या यहां तक कि एक सुलभ प्रतिलिपि द्वारा भी संतुष्ट हो सकता है। लेकिन Foo
न तो है। आपको ठीक करने के लिए:
class Foo
{
public:
Foo(int i) : i_(i) {}
Foo(const Foo&) = default;
Foo& operator=(const Foo&) = default;
int i_;
};
आईई। प्रतिलिपि सदस्यों को डिफ़ॉल्ट करें और हटाए गए चालक सदस्य को हटा दें।
आम तौर पर चाल सदस्यों को स्पष्ट रूप से हटाने का अच्छा विचार नहीं है। यदि आप कक्षा को प्रतिलिपि बनाना चाहते हैं लेकिन "चलने योग्य" नहीं हैं, तो बस ठीक उसी तरह घोषित करें जैसे आप सी ++ 03 में करेंगे: अपनी प्रतिलिपि सदस्यों को घोषित/परिभाषित करें। आप कॉपी सदस्यों को = default
के साथ संकलक-जेनरेट करने दे सकते हैं, और यह अभी भी उपयोगकर्ता-घोषणा के रूप में गिना जाता है। और चाल सदस्यों की घोषणा मत करो। उन सदस्यों को ले जाएं जो मौजूद नहीं हैं हटाए गए स्थान सदस्यों के समान नहीं हैं।
हटाए गए कदम सदस्यों का मतलब है कि आप एक रेवल्यू से Foo
की एक प्रति नहीं बना सकते हैं, भले ही कॉपी कन्स्ट्रक्टर ऐसा करने के लिए ठीक काम करता। यह शायद ही वांछित इरादा है।
भले ही आप अपनी कक्षा को कॉपी करने योग्य और न ही चलने योग्य बनाना चाहते हैं, फिर भी प्रतिलिपि सदस्यों को हटाना बेहतर है और आगे बढ़ने वाले सदस्यों को छोड़ दें (जिसका अर्थ है कि वे मौजूद नहीं होंगे)। यदि आप कभी भी कोड (स्वयं सहित) की समीक्षा कर रहे हैं, और हटाए गए कदम सदस्यों को देखते हैं, तो वे लगभग निश्चित रूप से गलत हैं, या सबसे अच्छे और भ्रामक हैं।
कुछ दिन कोई हटाए गए कदम सदस्यों के लिए एक अच्छा उपयोग केस के साथ आएगा। लेकिन यह एक दुर्लभ उपयोग मामला होगा। यदि आप कोड में ऐसा पैटर्न देखते हैं, तो आपको कोड लेखक को बहुत अच्छी स्पष्टीकरण की उम्मीद करनी चाहिए। अन्यथा, हटाए गए कदम सदस्यों को केवल गलत होने की संभावना है (सर्वोत्तम अनावश्यक पर)। लेकिन उज्ज्वल तरफ यह त्रुटि रन समय के बजाए संकलित समय पर दिखाई देगी (जैसा कि आपके उदाहरण में है)।
जब आप किसी विशेष सदस्यों को स्पष्ट रूप से घोषित करते हैं तो संकलक निश्चित रूप से क्या करेगा, इसका एक सारांश चार्ट है। उन वर्गों का लाल रंग लाल रंग का प्रतिनिधित्व करता है।
= default
और = delete
गिनती के रूप में उपयोगकर्ता के घोषित।
Click here यदि आप पूर्ण स्लाइड डेक देखना चाहते हैं।
क्योंकि push_back MoveInsertable होने के लिए प्रकार की आवश्यकता है। बस डॉक्स पढ़ें: http://en.cppreference.com/w/cpp/container/vector/push_back –