एक और सवाल का जवाब देने की प्रक्रिया में मैं कुछ अलग शब्दों के लिए लड़खड़ाया std::vector::erase()
और std::deque::erase()
।
यह वही है जो C ++ 14 के बारे में कहता है std::deque::erase
( [deque.modifiers]/4-6
,, मेरा जोर):
प्रभाव: ...
जटिलता: विध्वंसक को कॉल की संख्या उसी तरह होती है जैसे कि मिटाए गए तत्वों की संख्या, लेकिन असाइनमेंट ऑपरेटर को कॉल की संख्या तत्वों की संख्या से कम नहीं है पहले मिटाए गए तत्वों और तत्वों की संख्या से पहले मिटाए गए तत्व।
फेंकता है: कॉपी कंस्ट्रक्टर द्वारा कोई अपवाद नहीं फेंके जाने तक, कंस्ट्रक्टर, असाइनमेंट ऑपरेटर, या असाइनमेंट ऑपरेटर को स्थानांतरित न करें
T
।
और यहाँ इसके बारे में क्या कहते हैं std::vector::erase
( [vector.modifiers]/3-5
):
प्रभाव: ...
जटिलता: की नाशक
T
समय की संख्या कहा जाता है मिट तत्वों की संख्या के बराबर है, लेकिन इस कदम असाइनमेंट ऑपरेटर केT
समय की संख्या कहा जाता है मिट तत्वों के बाद वेक्टर में तत्वों की संख्या के बराबर।फेंकता है: कॉपी कंस्ट्रक्टर द्वारा कोई अपवाद नहीं फेंके जाने तक, कंस्ट्रक्टर, असाइनमेंट ऑपरेटर, या असाइनमेंट ऑपरेटर को स्थानांतरित न करें
T
।
जैसा कि आप देख सकते हैं, उन दोनों के लिए अपवाद विनिर्देश समान हैं, लेकिन इसके लिए std::vector
स्पष्ट रूप से उल्लेख किया गया है कि चाल असाइनमेंट ऑपरेटर कहा जाता है।
वहाँ भी के लिए आवश्यकता है T
होना करने के लिए MoveAssignable
के लिए erase()
दोनों के साथ काम करने के लिए std::vector
और std::deque
(तालिका 100), लेकिन इस कदम असाइनमेंट ऑपरेटर की उपस्थिति संकेत नहीं करता है: एक एक प्रति असाइनमेंट ऑपरेटर परिभाषित कर सकते हैं, और इस कदम असाइनमेंट ऑपरेटर को परिभाषित नहीं है, और इस वर्ग होगा हो MoveAssignable
।
बस के मामले में, मैंने जीसीसी और क्लैंग के साथ जांच की, और वास्तव में std::vector::erase()
कॉपी असाइनमेंट ऑपरेटर को कॉल करता है अगर कोई चाल असाइनमेंट ऑपरेटर नहीं है, और std::deque::erase()
वही ( डीईएमओ ) करता है।
तो सवाल यह है: क्या मुझे कुछ याद आया, या यह मानक में एक (संपादकीय) मुद्दा है?
अद्यतन: मैंने # 2477 LWG समस्या प्रस्तुत की है ।