आपको C ++ (विशेष रूप से std::vector) को सूचित करने की आवश्यकता है कि आपके मूव कंस्ट्रक्टर और डिस्ट्रॉक्टर उपयोग नहीं कर रहे हैं noexcept। फिर वेक्टर के बढ़ने पर मूव कंस्ट्रक्टर को बुलाया जाएगा।
यह एक चाल अवरोधक को घोषित करने और कार्यान्वित करने का तरीका है, जिसका सम्मान किया जाता है std::vector:
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) ;
}
यदि कंस्ट्रक्टर नहीं है noexcept, std::vectorतो इसका उपयोग नहीं कर सकते हैं, तब से यह मानक द्वारा मांग की गई अपवाद की गारंटी को सुनिश्चित नहीं कर सकता है।
मानक में क्या कहा गया है, इसके बारे में अधिक जानने के लिए, C ++ मूवमेंट शब्दार्थ और अपवाद पढ़ें
बो को क्रेडिट जिसने संकेत दिया कि इसका अपवादों के साथ करना पड़ सकता है। इसके अलावा emplace_backजब संभव हो तो केरेक एसबी की सलाह और उपयोग पर विचार करें । यह तेज हो सकता है (लेकिन अक्सर नहीं होता है), यह स्पष्ट और अधिक कॉम्पैक्ट हो सकता है, लेकिन कुछ नुकसान भी हैं (विशेषकर गैर-स्पष्ट कंस्ट्रक्टर के साथ)।
संपादित करें , अक्सर डिफ़ॉल्ट वही होता है जो आप चाहते हैं: जो कुछ भी ले जाया जा सकता है उसे स्थानांतरित करें, बाकी को कॉपी करें। स्पष्ट रूप से उस के लिए पूछना, लिखना
A(A && rhs) = default;
ऐसा करने पर, आपको जब संभव हो तो noexcept मिलेगा: क्या डिफ़ॉल्ट मूव कंस्ट्रक्टर को noexcept के रूप में परिभाषित किया गया है?
ध्यान दें कि विज़ुअल स्टूडियो 2015 के शुरुआती संस्करणों और पुराने ने इसका समर्थन नहीं किया, भले ही यह कदम शब्दार्थ का समर्थन करता हो।