दिलचस्प पोस्ट
फेसबुक के साथ रजिस्टर कभी कभी ईमेल नहीं प्रदान करता है जावा: किसी दूसरे वर्ग से तरीकों तक कैसे पहुंचें क्या बाइनरी छवि डेटा को HTML मार्कअप में रखना संभव है और फिर किसी भी ब्राउज़र में छवि को सामान्य रूप में प्रदर्शित किया जा सकता है? इसे पारित करने में क्या अंतर है। किसी भी <int> () और इसका मान। किसी भी <int> () एक विधि सेटअप आप क्लासिक एएसपी कैसे डिबग करते हैं? लिमिट 10..20 SQL सर्वर में एक सूचीदृश्य में वर्तमान चयन दिखा रहा है किस क्रम में स्थैतिक ब्लॉक और स्थिर चर एक निष्पादित वर्ग में हैं? ggplot2 3 डी बार प्लॉट लिस्प में '(या बोली) का उपयोग कब करना है? मॉनिटर सभी जावास्क्रिप्ट ऑब्जेक्ट गुण (मैजिक गेस्टर्स और सेटर्स) कैसे नियतात्मक चल बिन्दु अशुद्धि है? गतिशील रूप से सी # विधि की सामग्री को बदलते हैं? UIWebView के अंदर जावास्क्रिप्ट डिबग करने के कुछ तरीके क्या हैं? MVC3 में चेकबॉक्स सूची देखें और नियंत्रक को पास किए गए चेक किए गए आइटम प्राप्त करें

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

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

std::vector<A> myvec; 

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

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

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

आपको सी ++ (विशेष रूप से 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;