दिलचस्प पोस्ट
एंड्रॉइड वेबव्यू – वेबपेज डिवाइस स्क्रीन पर फ़िट होना चाहिए ASP.NET बंडल कैसे minification अक्षम करने के लिए NoClassDefFoundEntelliJ आईडीईए उन्नयन के बाद त्रुटि MySQL: रैंडम एंट्री चुनें, लेकिन कुछ प्रविष्टियों के लिए वजन एक माध्यमिक थ्रेड से PyQt4 QTextEdit को stdout और stderr पुनर्निर्देशित करना टुकड़ों में बैकपैड () पर कैसे कार्यान्वित करें? एक गीट अलग सिर फिक्स? क्यों नहीं एक std :: shared_ptr <टी > विशेषज्ञता? Angular2 में ngShow और ngHide के बराबर क्या है? मेकफाइल, मैं उनका उपयोग कैसे कर सकता हूं? मैं लिनक्स में C ++ कोड को कैसे चल सकता हूं? प्रोसिबबिल्डर और रनटाइम। एक्सएसी () के बीच का अंतर सरणी के साथ दस्तावेज़ खोजें जिसमें एक विशिष्ट मान शामिल है आईएसओ 8601 प्रारूप से एक .NET डेटटाइम कैसे बनाएं php mysqli केवल एक पंक्ति देता है

जब सदिश बढ़ता है तो चाल शब्दों को कैसे लागू किया जाए?

मेरे पास एक निश्चित श्रेणी ए के ऑब्जेक्ट्स के एक std :: vector है। क्लास गैर-तुच्छ है और प्रतिलिपि कन्स्ट्रक्टर और कंसल्टेंट्स को परिभाषित करता है I

std::vector<A> myvec; 

यदि मैं वेक्टर के साथ ऑब्जेक्ट को myvec.push_back(a) उदाहरण के लिए myvec.push_back(a) ), वेक्टर आकार में बढ़ेगा, वेक्टर में तत्वों की नई प्रतियां इन्स्तांत करने के लिए प्रतिलिपि कन्स्ट्रक्टर A( const A&) का उपयोग कर।

क्या मैं किसी भी तरह लागू कर सकता हूं कि वर्ग A के चालन निर्माता की बजाय इसकी शुरुआत हो रही है?

वेब के समाधान से एकत्रित समाधान "जब सदिश बढ़ता है तो चाल शब्दों को कैसे लागू किया जाए?"

आपको सी ++ (विशेष रूप से std::vector ) सूचित करने की जरूरत है कि आपका noexcept निर्माता और नाशक बिना किसी भी noexcept का उपयोग करके फेंक नहीं करता है। तब वे चाल निर्माता बढ़ता है जब वेक्टर बढ़ता है।

यह स्टड :: वेक्टर द्वारा सम्मानित किया जाने वाला चालनकर्ता को घोषित करने और कार्यान्वित करने का तरीका है:

 A(A && rhs) noexcept { std::cout << "i am the move constr" <<std::endl; ... some code doing the move ... m_value=std::move(rhs.m_value) ; // etc... } 

यदि कन्स्ट्रक्टर का noexcept नहीं है, तो std :: vector इसका उपयोग नहीं कर सकता, तब से यह मानक द्वारा मांग की गई अपवाद गारंटी को सुनिश्चित नहीं कर सकता।

मानक में क्या कहा गया है, इसके बारे में अधिक जानने के लिए, सी ++ मूव क्रमिक और अपवाद पढ़ें

बो को श्रेय ने संकेत दिया था कि अपवादों के साथ ऐसा करना होगा। यह भी Kerrek एसबी की सलाह का पालन करें और जब संभव होता है emplace_back उपयोग करें

संपादित करें , अक्सर आप जो चाहते हैं वह डिफ़ॉल्ट होता है: जो कुछ भी स्थानांतरित किया जा सकता है उसे स्थानांतरित करें, शेष कॉपी करें इसके लिए स्पष्ट रूप से पूछें, लिखो

 A(A && rhs) = default; 

ऐसा करने से, जब भी संभव हो तो आपको अवश्य प्राप्त होगा: क्या डिफ़ॉल्ट मूव कन्स्ट्रक्टर को बिना किसी सीमा के रूप में परिभाषित किया गया है?

ध्यान दें कि Visual Studio 2015 और पुराने के शुरुआती संस्करणों का समर्थन नहीं किया, भले ही यह चाल शब्दों का समर्थन करता है

दिलचस्प है, जीसीसी 4.7.2 का वेक्टर केवल चालन निर्माता का उपयोग करता है यदि दोनों चालन निर्माता और नाशक का अंत नहीं है। एक सरल उदाहरण:

 struct foo { foo() {} foo( const foo & ) noexcept { std::cout << "copy\n"; } foo( foo && ) noexcept { std::cout << "move\n"; } ~foo() noexcept {} }; int main() { std::vector< foo > v; for ( int i = 0; i < 3; ++i ) v.emplace_back(); } 

यह अपेक्षित आउटपुट करता है:

 move move move 

हालांकि, जब मैं ~ foo () से दूर नहीं निकालता, परिणाम अलग होता है:

 copy copy copy 

मुझे लगता है कि यह भी इस सवाल का जवाब।

ऐसा लगता है, एकमात्र तरीका (सी ++ 17 और शुरुआती के लिए), redocation पर std::vector उपयोग चाल शब्दों को लागू करने के लिए प्रतिलिपि कन्स्ट्रक्टर को हटा रहा है 🙂 इस तरह यह आपके चालन निर्माता का उपयोग करेगा या समय संकलन में, कोशिश कर रहा मर जाएगा :)।

कई नियम हैं जहां std::vector reallocation पर चालन निर्माता का उपयोग नहीं करना चाहिए, लेकिन इसके बारे में कुछ भी नहीं है जहां इसे उपयोग करना चाहिए

 template<class T> class move_only : public T{ public: move_only(){} move_only(const move_only&) = delete; move_only(move_only&&) noexcept {}; ~move_only() noexcept {}; using T::T; }; 

जीना

या

 template<class T> struct move_only{ T value; template<class Arg, class ...Args, typename = std::enable_if_t< !std::is_same_v<move_only<T>&&, Arg > && !std::is_same_v<const move_only<T>&, Arg > >> move_only(Arg&& arg, Args&&... args) :value(std::forward<Arg>(arg), std::forward<Args>(args)...) {} move_only(){} move_only(const move_only&) = delete; move_only(move_only&& other) noexcept : value(std::move(other.value)) {}; ~move_only() noexcept {}; }; 

लाइव कोड

आपके T क्लास के पास noexcept निर्माता / noexcept ऑपरेटर होना चाहिए और noexcept अंत नहीं होना चाहिए। अन्यथा आप संकलन त्रुटि प्राप्त करेंगे।

 std::vector<move_only<MyClass>> vec;