std::bind
और std::thread
कुछ डिज़ाइन सिद्धांत साझा करें। के बाद से उन दोनों को पारित कर दिया तर्क करने के लिए इसी स्थानीय objets की दुकान, हम अगर संदर्भ अर्थ विज्ञान वांछित है या तो std::ref
या std::cref
उपयोग करने की आवश्यकता:बाय-रेफ तर्क: क्या यह std :: thread और std :: bind के बीच एक असंगतता है?
void f(int& i, double d) { /*...*/ }
void g() {
int x = 10;
std::bind(f, std::ref(x), _1) (3.14);
std::thread t1(f, std::ref(x), 3.14);
//...
}
लेकिन मैं हाल ही में एक निजी खोज द्वारा intrigued रहा हूँ: std::bind
करने के लिए आप की अनुमति देगा उपरोक्त मामले में एक मूल्य पास करें, भले ही यह आमतौर पर कोई नहीं चाहता है।
std::bind(f, x, _1) (3.14); // Usually wrong, but valid.
हालांकि, यह std::thread
के लिए सच नहीं है। निम्नलिखित एक संकलन त्रुटि ट्रिगर करेगा।
std::thread t2(f, x, 3.14); // Usually wrong and invalid: Error!
पहली बार मैंने सोचा कि यह एक कंपाइलर बग था, लेकिन त्रुटि वास्तव में वैध है। ऐसा लगता है कि std::thread
के कन्स्ट्रक्टर का टेम्पलेट संस्करण copy decayingआवश्यकता (int&
int
में) 30.3.1.2 द्वारा लगाए गए तर्कों को सही ढंग से कम करने में सक्षम नहीं है।
सवाल यह है: std::bind
के तर्कों के समान कुछ क्यों नहीं चाहिए? या यह स्पष्ट असंगतता का इरादा है?
नोट: समझाया गया है कि यह नीचे दी गई टिप्पणी में डुप्लीकेट क्यों नहीं है।
यह डुप्लिकेट नहीं है। * वह * प्रश्न बता रहा है कि * मेरे * प्रश्न का प्रीमियर क्या है। इसके अलावा, यह std :: धागा को स्पर्श नहीं करता है। असल में, जो मैं इंगित कर रहा हूं वह वहां टिप्पणियों में से एक का उदाहरण है (लगभग std :: धागे के निर्माता। –