MSVC2012 का उपयोग करना,std :: packaged_task <void()> मान्य क्यों है?
निम्नलिखित कोड संकलन और अपेक्षा के अनुरूप
std::packaged_task< int() > task([]()->int{ std::cout << "hello world" << std::endl; return 0; });
std::thread t(std::move(task));
t.join();
चलेंगे, जबकि निम्न कोड संकलन और चलाने
std::packaged_task< void() > task([](){ std::cout << "hello world" << std::endl; });
std::thread t(std::move(task));
t.join();
क्यों है ऐसा करने के लिए असफल हो जायेगी?
संपादित करें: समाधान के लिए, यह एक समारोह है कि रिटर्न शून्य
std::promise<void> promise;
auto future = promise.get_future();
std::thread thread([](std::promise<void> &p){ std::cout << "hello world" << std::endl; p.set_value(); }, std::move(promise));
future.wait();
नोट वहाँ vs2012 पुस्तकालय में एक बग है कि पर std :: एक एसटीडी पाने के लिए वादा :: भविष्य उपयोग करना संभव है std :: थ्रेड के साथ जो आपको एल-वैल्यू संदर्भ के रूप में वादा करने के लिए मजबूर करता है और वादा को स्थानांतरित करता है, यदि आप मान द्वारा या आर-वैल्यू संदर्भ द्वारा वादा पास करते हैं तो यह संकलित नहीं होगा। ऐसा माना जाता है क्योंकि कार्यान्वयन std :: bind() का उपयोग करता है जो अपेक्षित व्यवहार नहीं करता है।
दिलचस्प ... संकलन करते समय दूसरा क्या त्रुटि देता है? – Yuushi
यह शायद एमएसवीसी ++ में एक बग है। –
जो मैंने के कार्यान्वयन में पाया है, वह अंततः फ़ंक्शन ऑब्जेक्ट निष्पादन स्थिति के अपने संग्रहण पर आता है, विशेष रूप से '_State_manager' नामक टेम्पलेट वर्ग में। 'शून्य' राज्य के लिए '_State_manager' का कोई विशेषज्ञता नहीं है, जो कि एक बग पसंद है। मैं भी लंच के लिए पूरी तरह से बाहर हो सकता है, लेकिन जहां यह प्रतीत होता है कि सबकुछ अलग हो जाता है। –
WhozCraig