क्यों std::runtime_error
एक निर्माता एक std::string&&
को स्वीकार प्रदान नहीं करता है? the constructors for std::string
पर देखकर, इसमें एक चालक कन्स्ट्रक्टर है, लेकिन noexcept
विनिर्देश केवल सी ++ 14 के लिए है, सी ++ 11 नहीं। क्या यह एक गलती थी, एक समय सीमा जो चूक गई थी या क्या मुझे कुछ याद आ रहा है?चाल निर्माता :: runtime_error
उत्तर
explicit runtime_error(string&&);
बस मौजूद नहीं है, क्योंकि यह किसी भी अनुकूलन प्रदान नहीं होता।
जैसा कि यह पता चला है, एक सी ++ 11-अनुरूप runtime_error
आंतरिक रूप से std::string
स्टोर नहीं करता है। कारण यह है कि runtime_error
के प्रति सदस्यों को अपवाद नहीं फेंकना चाहिए। अन्यथा जब संकलक इसे फेंकने की प्रक्रिया में अपवाद ऑब्जेक्ट की प्रतिलिपि बनाता है तो गलत अपवाद फेंक दिया जा सकता है।
इसका मतलब है कि runtime_error
एक गैर परिवर्तनशील संदर्भ गिना स्ट्रिंग संग्रहीत करना होगा। हालांकि सी ++ 11 std::string
के लिए गाय-कार्यान्वयन को रोकता है। std::string
के कार्यान्वयन "शॉर्ट-स्ट्रिंग-ऑप्टिमाइज़ेशन" में स्थानांतरित हो गए हैं, जो स्ट्रिंग की लंबाई "छोटी सीमा" से परे है, तो कॉपी निर्माण पर आवंटित होना चाहिए। और runtime_error
बनाने के लिए प्रयुक्त तारों की लंबाई पर कोई सीमा नहीं है।
std::string
:तो प्रभावी ढंग से सी ++ 11 (और आगे) तार के दो कार्यान्वयन शामिल है यह आमतौर पर एक प्रति निर्माता के साथ एक छोटी-स्ट्रिंग-अनुकूलित प्रकार है और काम है कि करने में सक्षम है नकल अपवाद फेंकना
std::runtime_error
: यह एक अपरिवर्तनीय संदर्भ-गणना वाली स्ट्रिंग है (या रखती है)। यह कॉपी निर्माण या कॉपी असाइनमेंट पर कभी फेंक नहीं देगा।
और
explicit runtime_error(string&&);
कर सकते हैं कभी नहीं (कुशलता) "टाइप 2" स्ट्रिंग के लिए "टाइप 1" स्ट्रिंग से स्थानांतरण संसाधनों।
किस प्रकार की 2 स्ट्रिंग ब्याज से बाहर दिखाई देगी? (यदि यह एक काले बॉक्सिंग, छिपे हुए, कार्यान्वयन से परिभाषित आंतरिक प्रकार है तो है कि एक पर्याप्त जवाब है।) –
यह एक सी ++ 03 गाय आधारित 'std :: स्ट्रिंग' के गैर परिवर्तनशील भागों की तरह लग सकता है। दरअसल, यह वही है जो libC++ किया था। इसके टाइप 2 स्ट्रिंग एक ABI जीसीसी-4.2 'std :: स्ट्रिंग' के समान ताकि' runtime_error' libc से फेंकी जा सकती है ++ और libstdC++ (और इसके विपरीत) का उपयोग करते हुए पकड़ा, * है * एक ही आवेदन के भीतर। –
आप ऐसा क्यों करना चाहते हैं? –
- 1. वेक्टर पुनः आबंटन चाल निर्माता
- 2. डिफ़ॉल्ट चाल निर्माता और संदर्भ सदस्यों
- 3. स्पष्ट रूप से नष्ट कर दिया चाल निर्माता
- 4. विनाश के माध्यम से चाल असाइनमेंट + चाल निर्माण सुरक्षित है?
- 5. लापता std :: क्यूटी + MinGW में runtime_error
- 6. अंतर: std :: runtime_error बनाम std :: अपवाद()
- 7. std :: runtime_error से कैसे प्राप्त किया जाए?
- 8. डिफ़ॉल्ट चाल कन्स्ट्रक्टर
- 9. क्यों हटाया जा रहा है चाल निर्माता कारण वेक्टर अगर मैं एक कक्षा में कदम निर्माता रोकना काम कर
- 10. अपवाद वर्ग * निर्माता
- 11. कन्स्ट्रिग कन्स्ट्रक्टर चाल के लिए?
- 12. std :: चाल असाइनमेंट ऑपरेटर के अंदर कदम
- 13. निर्माता
- 14. निर्माता
- 15. निर्माता
- 16. निर्माता
- 17. निर्माता
- 18. निर्माता
- 19. निर्माता
- 20. निर्माता
- 21. निर्माता
- 22. निर्माता
- 23. निर्माता
- 24. अनुकूलन युक्तियाँ और चाल
- 25. सीएसएस हैक्स (चाल)
- 26. स्पष्ट चाल कन्स्ट्रक्टर?
- 27. rm ./-rf "चाल"
- 28. वैराडिक मैक्रो चाल
- 29. imagePickerController चाल और पैमाने
- 30. चाल अर्थ विज्ञान एसटीडी
तो 'std :: runtime_error' एक निर्माता लेने' था std :: स्ट्रिंग && ', यह निश्चित रूप से नहीं एक चाल निर्माता होगा। एक चालक कन्स्ट्रक्टर 'std :: runtime_error &&' ले जाएगा। –
मुझे यकीन नहीं है कि मैं अनुसरण करता हूं: शुरुआत से निर्णय लेता है ऐसा लगता है कि आपका प्रश्न 'runtime_error' के बारे में है, लेकिन फिर आप' std :: string' पर स्विच करते हैं। आप किस बिंदु को बनाने की कोशिश कर रहे हैं? –
@AndyProwl: 'std :: runtime_error' वर्तमान में' const std :: string & 'या 'const const char * what_arg' से बनाया जा सकता है। वह पूछ रहा है कि इसे 'std :: string &&' से क्यों नहीं बनाया जा सकता है। –