दिलचस्प पोस्ट
XML पार्सिंग के लिए सर्वश्रेष्ठ नोड मॉड्यूल एक सरणी में सर्वोच्च घटना के साथ तत्व प्राप्त करें जावास्क्रिप्ट कोड jsfiddle में काम करता है, लेकिन ब्राउज़र में नहीं Asp.net MVC मॉडलस्टेट। क्लीअर HEAD अनुरोधों के साथ सामग्री-लंबाई शीर्षलेख? ओवरलैपिंग आयतों का क्षेत्र खोजने के लिए एक कुशल एल्गोरिथ्म क्या है I दृश्यता में क्या अंतर है: छिपा हुआ और प्रदर्शन: कोई नहीं? PHP में माइक्रोसॉफ्ट-एन्कोडेड उद्धरणों को कैसे बदलना है क्या एक .net windows अनुप्रयोग को एक .exe में संकुचित किया जा सकता है? डब्लूपीएफ़ कमांडपैमेट्रर पहली बार नल है जिसे कैनक्सक्च्यूट कहा जाता है कोई संसाधन नहीं मिला जो दिए गए नाम से मेल खाता है '@ शैली / थीम। AppCompat.Light' यादृच्छिक। आगे हमेशा एक ही मान देता है सी प्रोग्रामिंग में Fflush (stdin) का उपयोग क्या है Google मानचित्र एपीआई V3: कैसे एक बिंदु ए से दिशा बी (ब्लू लाइन) की दिशा दिखाती है? मैं SQL सर्वर में वास्तविक एक-से-एक रिश्ते को कैसे बनाऊं?

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

मेरे पास एक निश्चित श्रेणी ए के ऑब्जेक्ट्स के एक 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;