2017-01-13 17 views
21

सी ++ 17 a capture specification of [*this] के साथ इस ऑब्जेक्ट के प्रतिलिपि को प्रतिलिपि करेगा।सी ++ 17 लैम्ब्डा कैप्चर * यह

यह कैसे उपयोगी है? this कैप्चर करने से अलग कैसे है? क्या यह पहले से ही C12+ 14 [tmp = *this] के साथ हासिल नहीं किया जा सकता है? स्पष्टीकरण के लिए


बोनस क्यों P0018R3[=, tmp = *this] के बजाय उनके उदाहरण में [tmp = *this] उपयोग करता है। अगर उन्होंने [tmp = *this] का उपयोग किया था, तो सी ++ 14 समाधान के सभी सूचीबद्ध डाउनसाइड्स समाप्त हो जाएंगे।

+3

मुझे लगता है कि उन्होंने उदाहरणों को बहुत सरल बना दिया है। एक बार जब आप अतिरिक्त स्थानीय चर या पैरामीटर जोड़ते हैं, तो आप उन्हें कॉपी करके कैप्चर करना चाहते हैं। फिर '[=, ..]' भाग समझ में आता है (यदि आप उन्हें स्पष्ट रूप से एक-एक करके कैप्चर नहीं करना चाहते हैं)। – dyp

उत्तर

18

यह कैसे उपयोगी है? यह उपयोगी होता है जब आपको *this की एक प्रति की आवश्यकता होती है - उदाहरण के लिए, जब *this स्वयं लैम्ब्डा के मूल्यांकन के समय मान्य नहीं होता है।

this कैप्चर करने से यह अलग कैसे है? यह ऑब्जेक्ट की कॉपी करता है, ताकि जब लैम्ब्डा का मूल्यांकन किया जाए, तो this पॉइंटर मूल ऑब्जेक्ट की बजाय प्रतिलिपि को संदर्भित करता है।

क्या यह सी ++ 14 में [tmp = *this] के साथ हासिल किया जा सकता है? यह कर सकता है, लेकिन [*this] अधिक सुविधाजनक है, क्योंकि कोड tmp. के साथ सदस्य पहुंच को उपसर्ग किए बिना स्थानांतरित किया जा सकता है। अन्यथा, विशेष रूप से [=, tmp = *this] के साथ, जब आप प्रतिलिपि का उल्लेख करना चाहते थे तो विशेष रूप से मूल ऑब्जेक्ट के सदस्यों को संदर्भित करना संभव है (विशेष रूप से यदि आप कट + पेस्ट प्रोग्रामिंग की आदत में हैं)। [=,*this] इस मामले में एक सुरक्षित विकल्प है, क्योंकि मूल this पहुंच योग्य नहीं है।

1

कल्पना कीजिए कि *this एक हैंडल क्लास है, जो कुछ साझा स्थिति में shared_ptr रखता है।

साझा प्रत्यारोपण (उदाहरण के लिए) प्रोटोकॉल हैंडलर राज्य मशीन है।

हैंडल क्लास एसिंक्रोनस हैंडलर की एक श्रृंखला के माध्यम से पारित किया जाता है, इसलिए स्वयं को कॉपी करने योग्य होना चाहिए। प्रत्येक हैंडलर साझा राज्य को बदल देता है।

कस्टम asio सेवा (उदाहरण के लिए, http_protocol_socket) के साथ इसका उपयोग करने के लिए एक मजबूत उपयोग केस प्रोटोकॉल हैंडलर हो सकता है।

[=, tmp = *this] मिश्रित होकर,, मूल्य द्वारा ऐसा कोई भी चर पर कब्जा भी शामिल है, बल्कि खतरनाक तरीके से, this सूचक ही साथ ही विशेष रूप से tmp में *this पर कब्जा करने के रूप में।

इस उपयोग के मामले में अनजाने में एसिंक हैंडलर में this का उल्लेख करना खतरनाक होगा, क्योंकि यह एक खतरनाक सूचक होने की संभावना है। यह एक बग होने का इंतजार कर रहा है।

[tmp=*this] केवल *this पर कब्जा करेगा।

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