2015-01-18 17 views
9

क्यों std::runtime_error एक निर्माता एक std::string&& को स्वीकार प्रदान नहीं करता है? the constructors for std::string पर देखकर, इसमें एक चालक कन्स्ट्रक्टर है, लेकिन noexcept विनिर्देश केवल सी ++ 14 के लिए है, सी ++ 11 नहीं। क्या यह एक गलती थी, एक समय सीमा जो चूक गई थी या क्या मुझे कुछ याद आ रहा है?चाल निर्माता :: runtime_error

+0

तो 'std :: runtime_error' एक निर्माता लेने' था std :: स्ट्रिंग && ', यह निश्चित रूप से नहीं एक चाल निर्माता होगा। एक चालक कन्स्ट्रक्टर 'std :: runtime_error &&' ले जाएगा। –

+0

मुझे यकीन नहीं है कि मैं अनुसरण करता हूं: शुरुआत से निर्णय लेता है ऐसा लगता है कि आपका प्रश्न 'runtime_error' के बारे में है, लेकिन फिर आप' std :: string' पर स्विच करते हैं। आप किस बिंदु को बनाने की कोशिश कर रहे हैं? –

+0

@AndyProwl: 'std :: runtime_error' वर्तमान में' const std :: string & 'या 'const const char * what_arg' से बनाया जा सकता है। वह पूछ रहा है कि इसे 'std :: string &&' से क्यों नहीं बनाया जा सकता है। –

उत्तर

14

explicit runtime_error(string&&);

बस मौजूद नहीं है, क्योंकि यह किसी भी अनुकूलन प्रदान नहीं होता।

जैसा कि यह पता चला है, एक सी ++ 11-अनुरूप runtime_error आंतरिक रूप से std::string स्टोर नहीं करता है। कारण यह है कि runtime_error के प्रति सदस्यों को अपवाद नहीं फेंकना चाहिए। अन्यथा जब संकलक इसे फेंकने की प्रक्रिया में अपवाद ऑब्जेक्ट की प्रतिलिपि बनाता है तो गलत अपवाद फेंक दिया जा सकता है।

इसका मतलब है कि runtime_error एक गैर परिवर्तनशील संदर्भ गिना स्ट्रिंग संग्रहीत करना होगा। हालांकि सी ++ 11 std::string के लिए गाय-कार्यान्वयन को रोकता है। std::string के कार्यान्वयन "शॉर्ट-स्ट्रिंग-ऑप्टिमाइज़ेशन" में स्थानांतरित हो गए हैं, जो स्ट्रिंग की लंबाई "छोटी सीमा" से परे है, तो कॉपी निर्माण पर आवंटित होना चाहिए। और runtime_error बनाने के लिए प्रयुक्त तारों की लंबाई पर कोई सीमा नहीं है।

  1. std::string:

    तो प्रभावी ढंग से सी ++ 11 (और आगे) तार के दो कार्यान्वयन शामिल है यह आमतौर पर एक प्रति निर्माता के साथ एक छोटी-स्ट्रिंग-अनुकूलित प्रकार है और काम है कि करने में सक्षम है नकल अपवाद फेंकना

  2. std::runtime_error: यह एक अपरिवर्तनीय संदर्भ-गणना वाली स्ट्रिंग है (या रखती है)। यह कॉपी निर्माण या कॉपी असाइनमेंट पर कभी फेंक नहीं देगा।

और

explicit runtime_error(string&&);

कर सकते हैं कभी नहीं (कुशलता) "टाइप 2" स्ट्रिंग के लिए "टाइप 1" स्ट्रिंग से स्थानांतरण संसाधनों।

+1

किस प्रकार की 2 स्ट्रिंग ब्याज से बाहर दिखाई देगी? (यदि यह एक काले बॉक्सिंग, छिपे हुए, कार्यान्वयन से परिभाषित आंतरिक प्रकार है तो है कि एक पर्याप्त जवाब है।) –

+5

यह एक सी ++ 03 गाय आधारित 'std :: स्ट्रिंग' के गैर परिवर्तनशील भागों की तरह लग सकता है। दरअसल, यह वही है जो libC++ किया था। इसके टाइप 2 स्ट्रिंग एक ABI जीसीसी-4.2 'std :: स्ट्रिंग' के समान ताकि' runtime_error' libc से फेंकी जा सकती है ++ और libstdC++ (और इसके विपरीत) का उपयोग करते हुए पकड़ा, * है * एक ही आवेदन के भीतर। –

+0

आप ऐसा क्यों करना चाहते हैं? –

संबंधित मुद्दे