कैप्चरिंग लैम्बडा लौटने पर आज मुझे सी ++ 11 लैम्बडा में एक बहुत ही अनजान व्यवहार (मेरे लिए, कम से कम) का सामना करना पड़ा। प्रश्न में कोड निम्न है:एक स्थानीय चर
#include <stdio.h>
auto sum(int x) {
return [&x](int y) {
return x + y;
};
}
int main() {
int a = sum(2)(3);
printf("%d\n",a);
}
प्रिंटिंग के बजाय, यह प्रिंट गिब्बिश। असल में, कम से कम जीसीसी के मेरे संस्करण में, यदि मैं -ओ 2 अनुकूलन ध्वज चालू करता हूं, तो यह वास्तव में प्रिंट करता है 5. चूंकि आउटपुट कंपाइलर के अनुकूलन स्तर पर निर्भर करता है, यह अपरिभाषित व्यवहार है। थोड़ी देर के बाद, मुझे लगता है कि मुझे समझ में आया कि क्या हो रहा है।
जब फ़ंक्शन योग कहा जाता है, तो तर्क x के अनुरूप एक स्टैक वैरिएबल 2 पर सेट होता है, फिर फ़ंक्शन योग रिटर्न होता है, और इस स्टैक वैरिएबल को किसी भी कोड द्वारा अधिलेखित किया जा सकता है जिसे संकलक को निम्नलिखित कोड निष्पादित करने की आवश्यकता होती है , और उस समय तक लैम्ब्डा को अंततः निष्पादित किया जाता है, वह स्थान जहां एक्स अब 2 नहीं था, और प्रोग्राम 3 मनमाने ढंग से पूर्णांक में जोड़ता है।
क्या सी ++ में घुमाने के लिए कोई शानदार तरीका है गारंटी देता है कि चर सही ढंग से कब्जा कर लिया जाता है?
मूल्य '[=] 'द्वारा कैप्चर करें। – Galik
धन्यवाद! यह अपेक्षा की तुलना में आसान तरीका था। –
बस पाठक के लिए, यह सी ++ 14 है, सी ++ 11 नहीं। फ़ंक्शन रिटर्न मानों की कटौती टाइप करें C++ 14 में जोड़ा गया था। – cdhowie