टेम्पलेट क्लास std::iterator
को C++ 17 में बहिष्कृत करने के लिए सेट किया गया है। ऐसा क्यों? यह सुनिश्चित करने के लिए एक आसान तरीका रहा है कि std::iterator_traits
काम करता है, खासकर यदि आप डिफ़ॉल्ट टेम्पलेट तर्कों का उपयोग कर सकते हैं। क्या सी ++ 17 में ऐसा करने का कोई और तरीका है?std :: iterator क्यों बहिष्कृत है?
उत्तर
the proposal that suggested its deprecation से:
इटरेटर वर्गों लेखन के लिए एक सहायता के रूप में, मूल मानक पुस्तकालय पाँच typedefs iterator_traits द्वारा हर इटरेटर की उम्मीद की घोषणा को स्वचालित करने के इटरेटर वर्ग टेम्पलेट की आपूर्ति की। यह तो
std::ostream_iterator
के विनिर्देश में, पुस्तकालय अपने आप में इस्तेमाल किया गया था, उदाहरण के लिए:template <class T, class charT = char, class traits = char_traits<charT> > class ostream_iterator: public iterator<output_iterator_tag, void, void, void, void>;
void
तर्कों की लंबी अनुक्रम बस वर्ग परिभाषा ही है, में होने की उम्मीद typedefs उपलब्ध कराने से पाठक के लिए काफी कम स्पष्ट है जो वर्तमान कार्य ड्राफ्ट द्वारा लिया गया दृष्टिकोण, सी ++ 14 में पैटर्न सेट के बाद, जहां हमनेunary_function
औरbinary_function
से मज़दूरों की लाइब्रेरी में व्युत्पन्न को हटा दिया।कम स्पष्टता के अलावा, इटेटरेटर टेम्पलेट भी अनचाहे के लिए एक जाल देता है, क्योंकि सामान्य उपयोग में यह एक आश्रित बेस क्लास होगा, जिसका अर्थ है कि यह कक्षा के भीतर से नाम लुकअप के दौरान नहीं देखेगा या इसके सदस्य कार्य।
#include <iterator> template <typename T> struct MyIterator : std::iterator<std::random_access_iterator_tag, T> { value_type data; // Error: value_type is not found by name lookup // ... implementations details elided ... };
स्पष्टता के कारण अकेले नहीं रह जनादेश के लिए मानक पुस्तकालय विनिर्देश अद्यतन करने के लिए मानक इटरेटर adapators रूप LWG को मनाने के लिए पर्याप्त था: यह समझने के लिए क्यों निम्नलिखित सरल उपयोग काम नहीं करता है की कोशिश कर हैरान उपयोगकर्ताओं की ओर जाता है
std::iterator
से प्राप्त, इसलिए मानक के भीतर इस टेम्पलेट का कोई और उपयोग नहीं है। इसलिए, यह बहिष्कार के लिए एक मजबूत उम्मीदवार की तरह दिखता है।
आप LWG 2438 में एसटीएल के तर्क को भी देख सकते हैं। (ज/टी T.C.)
, यह कर वास्तव में नहीं के किसी अन्य तरीके के रूप में। आप मूल रूप से std::iterator
(जो बहुत कठिन नहीं है) के अपने संस्करण को लागू कर सकते हैं या मैन्युअल रूप से उन सभी टाइपिफ़ को लिख सकते हैं (जो कि बहुत मुश्किल नहीं है, और मैं वास्तव में इसे स्पष्टता के लिए पसंद करता हूं)।
[एलडब्ल्यूजी 2438] में एसटीएल का तर्क (https://timsong-cpp.github.io/lwg-issues/2438) ध्वनि भी लगता है: नाम उपयोगकर्ताओं को गुमराह कर सकता है (विशेष रूप से * अहम * कुछ अन्य प्रोग्रामिंग भाषाओं से) यह सोचने में कि व्युत्पत्ति अनिवार्य है, या 'std :: iterator' को स्वीकार करने वाले फ़ंक्शन को लिखना अर्थपूर्ण है। –
- 1. क्यों map.erase iterator देता है?
- 2. std :: map iterator कैसे काम करता है?
- 3. std :: strstream बहिष्कृत क्यों किया गया था?
- 4. क्यों std :: function :: argument_type को बहिष्कृत किया गया है?
- 5. जेनएफएसएम क्यों बहिष्कृत है?
- 6. body.scrollTop क्यों बहिष्कृत है?
- 7. क्यों absolutelayout बहिष्कृत है?
- 8. JButton.enable क्यों बहिष्कृत है?
- 9. JavaLetterOrDigit क्यों बहिष्कृत है?
- 10. टीएसडी क्यों बहिष्कृत है?
- 11. org.hibernate.cache.Cache क्यों बहिष्कृत है?
- 12. क्यों/Wp64 बहिष्कृत है?
- 13. splice() std :: list और iterator अमान्यता
- 14. std :: enable_if या iterator या सूचक
- 15. `std :: string :: प्रारंभ()`/`std :: string :: end()` द्वारा Iterator अमान्यता?
- 16. std :: set start() और std :: सेट iterator O (logn)
- 17. ++ iterator और iterator ++ के बीच प्रदर्शन अंतर?
- 18. क्या यह उचित व्यवहार है? std :: नक्शा iterator अमान्यकरण
- 19. std :: multiset :: iterator = NULL अब मान्य नहीं है?
- 20. निरंतर HTTP.UTF_8 क्यों बहिष्कृत है?
- 21. std :: std :: set के साथ काम क्यों नहीं करता है?
- 22. क्या Iterator समर्थन + ऑपरेटर है?
- 23. क्या std :: set :: iterator और std :: set :: const_iterator के बीच कोई परिचालन अंतर है?
- 24. सी ++ iterator?
- 25. लगातार नक्शा iterator mymap.begin लिए()
- 26. ग्रोवी - Iterator
- 27. C++ std :: iterator ऑर्डर के बारे में मानचित्र प्रश्न
- 28. std :: iterator की जोड़ी को बढ़ावा देने के लिए :: iterator_range
- 29. क्यों उत्पादइटर वापसी प्रकार Iterator [कोई]?
- 30. क्या पागलपन पागल है या यह एक वास्तविक std map iterator स्मृति रिसाव है?
हां, सी ++ 17 में एक ही चीज़ करने का एक आसान तरीका है: आप बस वही बात करते हैं _। "बहिष्कृत" का अर्थ है ** केवल ** ** यह ** ** भविष्य में दूर हो सकता है। इसका मतलब यह नहीं है कि आप इसका उपयोग नहीं कर सकते हैं, या यह हमेशा ऐसा नहीं करेगा जो उसने हमेशा किया था। –
@PeteBecker: लेकिन सवाल यह है कि, यदि इसे बहिष्कृत किया गया है, तो प्रोग्रामर इसका उपयोग क्यों करेंगे जब यह * अगले संस्करण में हो सकता है? अगर यह इतना आसान था, तो इसे शुरू करने के लिए क्यों बहिष्कृत किया जाता है? – Nawaz
@ नवाज - जो सवाल पीछे की ओर जाता है। यदि यह मानक में है, तो आप इसका उपयोग क्यों नहीं करेंगे? ** मानक में कुछ भी ** संभावित रूप से भविष्य में दूर जा सकता है। हां, जो कुछ बहिष्कृत है, उसे दूर जाने की संभावना अधिक हो सकती है, या शायद नहीं; सी हेडर पर विचार करें, जिन्हें सी ++ में बहिष्कृत किया गया है, लेकिन एक व्यावहारिक मामले के रूप में, कभी नहीं चलेगा। –