2013-09-26 5 views
14
std::function<int()> void f1() 
{ 
    int a, b, c, d, ..., x, y, z; 

    return [=] { return a + b + c; }; 
} 

बनामक्या यह हमेशा लैम्ब्डा अभिव्यक्ति में सभी को कैप्चर करने का एक बुरा अभ्यास है?

std::function<int()> void f2() 
{ 
    int a, b, c, d, ..., x, y, z; 

    return [a, b, c] { return a + b + c; }; 
} 

कहने की जरूरत नहीं, पूर्व, छोटे handier, और बाद की तुलना में अधिक सुंदर है।

हालांकि, मैं अब भी चिंता:

प्रदर्शन दृष्टिकोण से, बाद हमेशा पूर्व की तुलना में बेहतर है?

क्या मानक गारंटी लैम्बडा अभिव्यक्ति केवल आवश्यक चर को कैप्चर करती है? यानी पूर्व उदाहरण में, केवल ए, बी, सी पर कब्जा कर लिया गया है, अप्रयुक्त चर डी, ..., एक्स, वाई, जेड नहीं हैं।

+2

वे केवल उपयोग किए जाने वाले कैप्चर करते हैं। यहां एक लंबे शॉट द्वारा स्टाइल ट्रम्प प्रदर्शन। – chris

+0

@ क्रिस, क्या आप मुझे मानक के लिए संदर्भित कर सकते हैं? – xmllmx

+3

@xmllmx मैं आपको एक अनुच्छेद में नहीं देख सकता, लेकिन एक वर्ग पर विचार करें जिसमें साइड इफेक्ट्स (एक फ़ाइल लिखना, cout, आदि) के साथ एक प्रतिलिपि है। यदि लैम्ब्डा ने उस प्रकार के एक अप्रयुक्त, असूचीबद्ध वस्तु को मूल्य के आधार पर कब्जा कर लिया और इसलिए प्रतिलिपि निर्माता को बुलाया, तो यह * बहुत बुरा * होगा। तो इस पर 'कानून' को देखे बिना, मैं कहूंगा कि यह बहुत निश्चित है। – us2012

उत्तर

18

मानक गारंटी देता है कि यदि आप एक डिफ़ॉल्ट कैप्चर करते हैं, तो आसपास के वातावरण से उस डिफ़ॉल्ट कैप्चर द्वारा कब्जा कर लिया जाने वाला एकमात्र चर वे हैं जिन्हें आप वास्तव में लैम्ब्डा के अंदर उपयोग करते हैं।

इस तरह, कार्यों को कैप्चर करने के लिए अलग-अलग चर निर्दिष्ट करना जो आप उपयोग करने की अपेक्षा करते हैं, लेकिन प्रदर्शन को कभी प्रभावित नहीं करना चाहिए।

किसी को कौन परवाह करता है के लिए, मानक से सटीक शब्द (§5.1.2/11, 12) है: एक लैम्ब्डा अभिव्यक्ति एक संबद्ध कब्जा-डिफ़ॉल्ट और उसके यौगिक बयान है

11 तो odr-use (3.2) this या स्वत: भंडारण अवधि वाला एक चर और odr-used इकाई स्पष्ट रूप से कैप्चर नहीं की जाती है, तो odr-used इकाई को पूरी तरह से कैद किया जाता है; ऐसी संस्थाएं लैम्ब्डा अभिव्यक्ति के पहुंच के दायरे में घोषित की जाएंगी। [नोट]

12 एक इकाई को कैप्चर किया जाता है यदि इसे स्पष्ट रूप से या स्पष्ट रूप से कैप्चर किया जाता है। [...]

सारांश: एक अंतर्निहित कब्जा विनिर्देश ([=] या [&]) केवल चर कि लैम्ब्डा में किया जाता है पर कब्जा होगा।

1

वास्तव में नहीं ... अन्य भाषाओं को आपको यह निर्दिष्ट करने की आवश्यकता नहीं है कि आप क्या हासिल करना चाहते हैं।

कंपाइलर को यह बताएं कि यह कब आवश्यक हो सकता है।
यह कोई गलती नहीं करेगा, और यह "गलती से" लैम्बडा के अंदर अप्रयुक्त कुछ कैप्चर नहीं करेगा।
यदि आप स्पष्ट होना चाहते हैं (कभी-कभी यह समझ में आता है), यही पारंपरिक परंपराकारों के लिए बिल्कुल सही है।

0

अर्थात्, आपको केवल उन चरों को आयात करना चाहिए जिन्हें आपको वास्तव में अपने लैम्ब्डा के दायरे में चाहिए। अंतर्निर्मित प्रकारों के अलावा किसी भी अन्य चीज़ के लिए आप संदर्भ के साथ-साथ कैप्चर करना चाहते हैं।

+1

यदि लैम्ब्डा अभिव्यक्ति वापस आने का परिणाम है, तो संदर्भ के द्वारा चर को कैप्चर करना अधिकांश मामलों में एक खराब अभ्यास है। – xmllmx

+0

@xmllmx: मुझे नहीं पता कि इस उत्तर का कौन सा पहलू आप सही करने की कोशिश कर रहे हैं ... यह तब करने के लिए "खराब अभ्यास" नहीं है जब लैम्ब्डा वापस किया जा रहा हो; यह सादा गलत है। इस मामले में यह स्पष्ट रूप से होना चाहिए कि आपको संदर्भ द्वारा इसे कैप्चर नहीं करना चाहिए, क्योंकि कोड काम नहीं करेगा। इस जवाब में दी गई सलाह चिह्न पर काफी सुंदर है .. "जब संभव हो तो संदर्भ द्वारा कैप्चर करें"। – Mehrdad

+0

@ मेहरदाद, यदि एक लैम्ब्डा अभिव्यक्ति एक स्थिर चर का संदर्भ देती है, तो यह गलत नहीं है, भले ही यह वापसी का नतीजा हो। – xmllmx

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

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