मैं निम्नलिखित सी है ++ (11) कोड:std :: unique_lock पर std :: move क्यों नहीं है इसका कोई प्रभाव पड़ता है?
#include <mutex>
void unlock(std::unique_lock<std::mutex> && ulock)
{
}
int main(void)
{
std::mutex m;
std::unique_lock<std::mutex> ulock(m);
unlock(std::move(ulock));
if (ulock.mutex() == &m || ulock.owns_lock())
{
throw std::runtime_error("");
}
return 0;
}
क्या मैं समझ नहीं है क्यों म्युटेक्स अभी भी unlock()
से लौटने के बाद आयोजित किया जाता है। मेरी उम्मीद यह है कि std::move()
कॉल से unlock()
पर लौटने पर लॉक को दायरे से बाहर जाने और विनाशक द्वारा अनलॉक कर दिया जाता है। कम से कम, ऐसा लगता है कि std::move()
ulock
को mutex m
से "अनबाउंड" बनने के कारण होना चाहिए था।
मुझे क्या याद आ रही है?
'std :: move' खुद को कहीं भी कहीं भी स्थानांतरित नहीं करता है। यह बस एक रैवल्यू संदर्भ के लिए एक लाभा का कारण बनता है, जिससे यह चालक रचनाकारों और इस तरह के तर्क की अनुमति देता है। जो बदले में अस्थायी हैं (वे क्या सोचते हैं) के आंतरिक चोरी कर सकते हैं। लेकिन आपका कोड उनमें से किसी को भी कॉल नहीं करता है। 'अनलॉक (std :: move (ulock));' एक विस्तृत नो-ऑप है। –
मूल्य से 'std :: unique_lock' लेने के लिए 'अनलॉक' को परिभाषित करें, फिर – WhiZTiM
प्रभाव देखने के लिए इसमें जाएं, मैंने सोचा था कि std :: move() ने अद्वितीय_लॉक के लिए चालक कन्स्ट्रक्टर को बुलाया था। ऐसा लगता है कि यह मामला नहीं है ... बल्कि, 'अनलॉक()' में रावल संदर्भ एक प्रकार का "अधिसूचना" है जो * * * चालक कन्स्ट्रक्टर का उपयोग कर सकता है, इसलिए इसे चुनना चाहिए (यदि यह समझ में आता है)। –