पर विचार करें निम्नलिखित सी ++ विधि:उद्देश्य सी ++ ब्लॉक अर्थ विज्ञान
class Worker{
....
private Node *node
};
void Worker::Work()
{
NSBlockOperation *op=[NSBlockOperation blockOperationWithBlock: ^{
Tool hammer(node);
hammer.Use();
}];
....
}
क्या, वास्तव में, ब्लॉक पर कब्जा जब यह कब्जा "नोड" करता है? ब्लॉक, http://clang.llvm.org/docs/BlockLanguageSpec.html के लिए भाषा का विनिर्देश, अन्य मामलों के लिए स्पष्ट है:
यौगिक बयान के दायरे के भीतर इस्तेमाल किया चर स्वत: (ढेर) भंडारण में उन लोगों के अपवाद के साथ सामान्य तरीके से ब्लॉक करने के लिए बाध्य कर रहे हैं। इस प्रकार कोई व्यक्ति फ़ंक्शंस और ग्लोबल वेरिएबल्स तक पहुंच सकता है जैसा कि कोई उम्मीद करेगा, साथ ही साथ स्थिर स्थानीय चर। [testme]
ब्लॉक के कंपाउंड स्टेटमेंट के संदर्भ में स्थानीय स्वचालित (स्टैक) चर संदर्भित और अवरुद्ध प्रतियों के रूप में ब्लॉक द्वारा कब्जा कर लिया जाता है।
लेकिन यहां, क्या हम के वर्तमान मूल्य को इस पर कैप्चर करते हैं? की एक प्रति इस वर्कर की कॉपी कन्स्ट्रक्टर का उपयोग कर? या उस स्थान का संदर्भ जहां नोड संग्रहीत है?
विशेष रूप से, हम कहते हैं
{
Worker fred(someNode);
fred.Work();
}
वस्तु fred किसी भी अधिक मौजूद नहीं हो सकता है जब ब्लॉक चलाने हो जाता है लगता है। नोड का मूल्य क्या है? (मान लें कि अंतर्निहित नोड वस्तुओं हमेशा के लिए रहते हैं, लेकिन श्रमिक आते हैं और जाते।)
, तो इसके बजाय हम लिखा
void Worker::Work()
{
Node *myNode=node;
NSBlockOperation *op=[NSBlockOperation blockOperationWithBlock: ^{
Tool hammer(myNode);
hammer.Use();
}];
....
}
परिणाम अलग है?
सी ++ प्रकारों के बेहतर कैप्चरिंग अर्थशास्त्र के लिए सी ++ 11 लैम्बडा पर विचार करें। – justin
@justin: यह कैसे बेहतर है? एक सी ++ लैम्ब्डा मूल्य से 'यह' भी कैप्चर करेगा और सटीक वही अर्थशास्त्र होगा। – newacct
@ न्यूवेक्ट मैंने कभी लिखा नहीं है "इस 'के बेहतर कैप्चरिंग अर्थशास्त्र के लिए सी ++ 11 लैम्बडा पर विचार करें। हालांकि, एक अंतर यह है कि 'यह' ** ** ** ** लम्बास के साथ पूरी तरह से कब्जा नहीं किया गया है, जो एक अच्छा बचाव है। – justin