c++ - क्या(शून्य*) 1 का मतलब है




casting type-conversion (2)

मैं ROS का कोड पढ़ रहा हूं।

फ़ाइल में ros_comm/roscpp/include/ros/subscriber.h , मुझे ऐसा कोड दिखाई देता है:

operator void*() const { return (impl_ && impl_->isValid()) ? (void*)1 : (void*)0; }

ठीक है, (void *)0 को C में NULL माना जा सकता है, लेकिन क्या (void *)1 मतलब है?

यदि एक क्लास Foo में यह फ़ंक्शन है, तो इसका मतलब है कि हम इस तरह से कोड कर सकते हैं:

Foo foo;
void *ptr = foo;

सही? तो क्या इसका मतलब है कि void *ptr = (void *)1 संभव है? इसका क्या मतलब है?


C ++ 11 में explicit प्रासंगिक रूपांतरण पेश किए जाने से पहले bool को निहित रूपांतरण के साथ समस्याओं से बचने के लिए यह एक पुरानी चाल है। इसका उपयोग वैधता की जांच करने के लिए किया जाता है:

Subscriber my_subscriber = someFunction();
if (!my_subscriber) {
    // error case
}

महत्वपूर्ण बिंदु यह है कि कोई अंतर्निहित रूपांतरण void* से पूर्णांक प्रकारों तक मौजूद नहीं है, लेकिन एक bool से पूर्णांक प्रकारों में मौजूद है। इसी समय, void* से bool में एक अंतर्निहित रूपांतरण मौजूद है। इसका मतलब है कि यदि आप bool निहित रूपांतरण को परिभाषित करते हैं, तो निम्नलिखित आश्चर्यजनक रूप से मान्य है:

void my_func(int i);

void another_func() {
    Subscriber sub = something();
    my_func(sub);
}

void* रूपांतरण को परिभाषित करना void* उस मुद्दे से बचता है।

इन दिनों कि चाल हालांकि अप्रचलित है। C ++ 11 ने explicit रूपांतरण पेश किए। bool लिए explicit रूपांतरण if और छोरों की स्थितियों में माना जाता है, लेकिन अन्य समस्याग्रस्त मामलों में नहीं माना जाता है। इसका मतलब है कि इन दिनों कि रूपांतरण के रूप में लिखा जाना चाहिए:

explicit operator bool() const { return impl_ && impl_->isValid(); }

यह दर्शाता है कि या तो कोड लिखने वाला व्यक्ति उस भाषा या टूल से बहुत अच्छी तरह से परिचित नहीं है जिसका वे उपयोग कर रहे हैं, या कोड एक लंबे, लंबे समय से आसपास है और अलग-अलग लोगों द्वारा हैक किया गया है, संभवतः एक सी-टू-सी ++ पिछले कुछ समय में संक्रमण, अभी भी कुछ विरासत एपीआई अनुबंध ( void* उम्मीद करना) ले रहा है जो बदलने के लिए परेशानी हो सकती है।

ऐसे काम करने का कोई अच्छा कारण नहीं है, अगर आप स्रोत को देखें। impl_ एक boost::shared_ptr<Impl> जो operator bool लागू करता है, और Impl::isValid रिटर्न bool भी है। उपयोग करने का कोई कारण नहीं है, या कहीं भी कुछ भी वापस करने के लिए।

मूल रूप से, यह लेखन का एक विपरीत (और संभवतः खतरनाक) तरीका है:

return impl_ && impl_->isValid();






typecasting-operator