रेंज लाइब्रेरी में दो तरह के ऑपरेशन होते हैं:
- वे दृश्य जो आलसी हैं और अंतर्निहित कंटेनर की आवश्यकता है।
- वे क्रियाएं जो उत्सुक हैं, और परिणामस्वरूप नए कंटेनर का उत्पादन करती हैं (या मौजूदा लोगों को संशोधित करती हैं)
दृश्य हल्के हैं। आप उन्हें मूल्य से पास करते हैं और अंतर्निहित कंटेनर को वैध और अपरिवर्तित रहने की आवश्यकता होती है।
से पर्वतमाला-v3 प्रलेखन
एक दृश्य एक हल्का आवरण होता है जो तत्वों के अंतर्निहित अनुक्रम को किसी कस्टम तरीके से म्यूट या कॉपी किए बिना प्रस्तुत करता है। दृश्य बनाना और कॉपी करना और गैर-संदर्भ संदर्भ शब्दार्थ के लिए सस्ते हैं।
तथा:
अंतर्निहित रेंज पर कोई भी ऑपरेशन जो इसके पुनरावृत्तियों या प्रहरी को अमान्य करता है, उस सीमा के किसी भी हिस्से को संदर्भित करने वाले किसी भी दृश्य को अमान्य कर देगा।
अंतर्निहित कंटेनर का विनाश स्पष्ट रूप से सभी पुनरावृत्तियों को अमान्य करता है।
आपके कोड में आप विशिष्ट रूप से विचारों का उपयोग कर रहे हैं - आप उपयोग करते हैं ranges::views::transform
। पाइप महज एक वाक्य रचना चीनी है जो इसे लिखने के तरीके को आसान बनाता है। आपको पाइप में आखिरी चीज को देखना चाहिए जो आप पैदा करते हैं - आपके मामले में, यह एक दृश्य है।
यदि कोई पाइप ऑपरेटर नहीं था, तो यह संभवतः कुछ इस तरह दिखाई देगा:
ranges::views::transform(my_custom_rng_gen(some_param), my_transform_op)
अगर इस तरह से कई परिवर्तन जुड़े थे तो आप देख सकते हैं कि यह कितना बदसूरत हो जाएगा।
इस प्रकार, अगर my_custom_rng_gen
किसी प्रकार के कंटेनर का उत्पादन होता है, जिसे आप बदल देते हैं और फिर वापस लौट जाते हैं, तो वह कंटेनर नष्ट हो जाता है और आपके विचार से संदर्भ खतरे में पड़ जाते हैं। अगर my_custom_rng_gen
एक अन्य कंटेनर के लिए एक दृश्य है जो इन scopes के बाहर रहता है, तो सब कुछ ठीक है।
हालांकि, कंपाइलर को यह पहचानने में सक्षम होना चाहिए कि आप एक अस्थायी कंटेनर पर एक दृश्य लागू कर रहे हैं और एक संकलन त्रुटि के साथ आपको मारा।
यदि आप चाहते हैं कि आपका फ़ंक्शन किसी श्रेणी के कंटेनर के रूप में वापस आए, तो आपको परिणाम को स्पष्ट रूप से "भौतिक" करने की आवश्यकता है। उसके लिए, ranges::to
फ़ंक्शन के भीतर ऑपरेटर का उपयोग करें ।
अपडेट: आपकी टिप्पणी के बारे में अधिक प्रासंगिक होने के लिए "प्रलेखन कहां कहता है कि कंपोजिंग रेंज / पाइपिंग एक दृश्य लेता है और संग्रहीत करता है?"
पाइप केवल चीजों को आसानी से पढ़े जाने वाले अभिव्यक्ति में जोड़ने के लिए एक वाक्यविन्यास चीनी है। यह कैसे उपयोग किया जाता है पर निर्भर करता है, यह एक दृश्य वापस कर सकता है या नहीं। यह राइट-हैंड साइड तर्क पर निर्भर करता है। आपके मामले में यह है:
`<some range> | ranges::views::transform(...)`
इसलिए अभिव्यक्ति जो भी views::transform
लौटाती है।
अब, परिवर्तन के प्रलेखन को पढ़कर:
नीचे आलसी श्रेणी के कॉम्बिनेटरों या विचारों की एक सूची दी गई है, जो कि रेंज-वी 3 प्रदान करता है, और एक ब्लर का उपयोग कैसे किया जाता है, इसके बारे में बताया गया है।
[...]
views::transform
एक स्रोत रेंज और एक unary फ़ंक्शन को देखते हुए, एक नई श्रेणी लौटाएं जहां प्रत्येक परिणाम तत्व एक स्रोत तत्व के लिए unary फ़ंक्शन को लागू करने का परिणाम है।
इसलिए यह एक सीमा देता है, लेकिन चूंकि यह एक आलसी ऑपरेटर है, इसलिए यह जो रिटर्न देता है वह एक दृश्य है, इसके सभी शब्दार्थों के साथ।