आप (एक डिफ़ॉल्ट का निर्माण के साथ समानता खाली जाँच करने के लिए owner_before
करने के लिए दो कॉल उपयोग कर सकते हैं) कमजोर सूचक:
template <typename T>
bool is_uninitialized(std::weak_ptr<T> const& weak) {
using wt = std::weak_ptr<T>;
return !weak.owner_before(wt{}) && !wt{}.owner_before(weak);
}
यह केवल true
अगर w{} "==" weak
, जहां "=="
मालिक तुलना वापस आ जाएगी, और en.cppreference.com के अनुसार:
क्रम ऐसा है कि दो स्मार्ट संकेत बराबर ही अगर वे दोनों खाली हैं तुलना या अगर वे दोनों एक ही मालिक हैं वस्तु, भले ही प्राप्त() द्वारा प्राप्त पॉइंटर्स के मान अलग हैं (उदाहरण के लिए क्योंकि वे एक ही वस्तु के भीतर विभिन्न subobjects पर इंगित करते हैं)।
क्योंकि डिफ़ॉल्ट निर्माता एक खाली कमजोर सूचक निर्माण करती है, यह केवल लौट सकते हैं true
अगर weak
भी खाली है। true
weak
की समयसीमा समाप्त हो जाएगी।
उत्पन्न विधानसभा (अनुकूलन के साथ) को देखते हुए, यह बहुत अनुकूलित लगता है:
bool is_uninitialized<int>(std::weak_ptr<int> const&):
cmp QWORD PTR [rdi+8], 0
sete al
ret
... तुलना weak.expired()
जाँच करने के लिए:
bool check_expired(std::weak_ptr<int> const&):
mov rdx, QWORD PTR [rdi+8]
mov eax, 1
test rdx, rdx
je .L41
mov eax, DWORD PTR [rdx+8]
test eax, eax
sete al
.L41:
rep ret
... या returning !weak.lock()
(~ 80 लाइनों असेंबली के)।
आप उपयोग कर सकते हैं 'समाप्त हो गया' लेकिन AFAIK में अंतर बताने का कोई तरीका नहीं है। – NathanOliver
कुछ जो अनुकरण करता है ['std :: वैकल्पिक'] (http://en.cppreference.com/w/cpp/utility/optional) शायद – AndyG