विभिन्न कलाकारों को अलग-अलग संकलक द्वारा बुलाया गया


80

निम्नलिखित लघु सी + + कार्यक्रम पर विचार करें:

#include <iostream>

class B {
public:
    operator bool() const {
        return false;
    }
};

class B2 : public B {
public:
    operator int() {
        return 5;
    }
};

int main() {
    B2 b;
    std::cout << std::boolalpha << (bool)b << std::endl;
}

यदि मैं इसे विभिन्न संकलकों पर संकलित करता हूं, तो मुझे विभिन्न परिणाम मिलते हैं। क्लैंग 3.4 और जीसीसी 4.4.7 के साथ यह प्रिंट करता है true, जबकि विज़ुअल स्टूडियो 2013 प्रिंट करता है false, जिसका अर्थ है कि वे अलग-अलग कलाकारों को बुलाते हैं (bool)b। मानक के अनुसार सही व्यवहार कौन सा है?

में मेरी समझ operator bool()कोई रूपांतरण की जरूरत है, जबकि operator int()एक की आवश्यकता होगी intकरने के लिए boolरूपांतरण, इसलिए संकलक पहले एक का चयन करना चाहिए। क्या constइसके साथ कुछ ऐसा होता है, क्या कॉन्स्टेबल-रूपांतरण को संकलक द्वारा अधिक "महंगा" माना जाता है?

यदि मैं हटाता हूं const, तो सभी कंपाइलर falseआउटपुट के रूप में समान रूप से उत्पन्न होते हैं । दूसरी ओर, अगर मैं दो वर्गों को एक साथ जोड़ देता हूं (दोनों ऑपरेटर एक ही कक्षा में होंगे) सभी तीन संकलक trueआउटपुट का उत्पादन करेंगे ।


3
जैसा कि मैं समझता हूं, बी 2 में 2 ऑपरेटर हैं: बी :: ऑपरेटर बूल () और बी 2 :: ऑपरेटर इंट ()। दोनों ऑपरेटर कांस्ट ऑपरेटर्स नहीं हैं और कांस्टेबल और नॉन-कास्ट संस्करणों के बीच अंतर है। आप बी के बी संस्करण में कास्ट संस्करण और इंट के बी 2 के कॉस्ट संस्करण को जोड़ सकते हैं और परिवर्तन देख सकते हैं।
तनूकी

1
constयहाँ कुंजी है। दोनों ऑपरेटर समान रूप से कॉन्स्टेबल हैं या नहीं, वे अपेक्षा के अनुरूप व्यवहार करते हैं, boolसंस्करण "जीतता है"। विभिन्न गति के साथ, हर मंच पर हमेशा नॉन-कास्ट संस्करण "जीतता है"। व्युत्पन्न वर्गों और ऑपरेटरों की विभिन्न स्थिरता के साथ, वीएस के पास एक बग है क्योंकि यह अन्य दो संकलक की तुलना में अलग तरह से व्यवहार करता है।
buc

क्या अलग-अलग डिफ़ॉल्ट निर्माता अलग व्यवहार के लिए जिम्मेदार हो सकते हैं?
ldgorman

16
ईडीजी भी छापता है true। यदि जीसीसी, क्लैंग और ईडीजी सभी सहमत हैं और एमएसवीसी असहमत हैं जिसका आमतौर पर मतलब है कि एमएसवीसी गलत है।
जोनाथन वेकली

1
नोट: C ++ में सामान्य रूप से, वापसी प्रकार अधिभार संकल्प में भाग नहीं लेता है।
Matthieu एम।

जवाबों:


51

मानक बताता है:

एक व्युत्पन्न वर्ग में एक रूपांतरण फ़ंक्शन एक बेस क्लास में रूपांतरण फ़ंक्शन को नहीं छुपाता है जब तक कि दो फ़ंक्शन एक ही प्रकार में परिवर्तित नहीं होते हैं।

Class12.3 [class.conv]

जिसका अर्थ है कि operator boolवह छिपा नहीं है operator int

मानक बताता है:

ओवरलोड रिज़ॉल्यूशन के दौरान, निहित ऑब्जेक्ट तर्क अन्य तर्कों से अप्रभेद्य है।

.113.3.3.1 [over.match.funcs]

इस मामले में "निहित वस्तु तर्क" है b, जो कि प्रकार का है B2 &operator boolआवश्यकता है const B2 &, इसलिए संकलक bको कॉल करने के लिए कॉन्स्ट जोड़ना होगा operator bool। यह - अन्य सभी चीजें समान होना - operator intएक बेहतर मेल बनाती है।

मानक बताता है कि static_cast(जो C- स्टाइल कास्ट इस उदाहरण में प्रदर्शन कर रहा है) एक प्रकार में परिवर्तित हो सकता है T(इस मामले में int) यदि:

T t(e);कुछ आविष्कार किए गए अस्थायी चर के लिए घोषणा अच्छी तरह से बनाई गई है t

§5.2.9 [expr.static.cast]

इसलिए intएक में परिवर्तित किया जा सकता है bool, और एक boolसमान रूप से परिवर्तित किया जा सकता है bool

मानक बताता है:

Sइसके आधार वर्गों के रूपांतरण कार्यों पर विचार किया जाता है। उन गैर-स्पष्ट रूपांतरण फ़ंक्शंस जो भीतर Sऔर उपज प्रकार में छिपे नहीं हैं T या एक प्रकार जिसे Tमानक रूपांतरण अनुक्रम के माध्यम से टाइप करने के लिए परिवर्तित किया जा सकता है, उम्मीदवार कार्य हैं।

.513.3.1.5 [over.match.conv]

तो अधिभार सेट के होते हैं operator intऔर operator bool। अन्य सभी चीजें समान हो रही हैं, operator intएक बेहतर मेल है (क्योंकि आपको कब्ज नहीं जोड़ना है)। इसलिए operator intचुना जाना चाहिए।

ध्यान दें कि (शायद अंतर्ज्ञान के खिलाफ) मानक रिटर्न प्रकार पर विचार नहीं करता है (यानी जिस प्रकार से ये ऑपरेटर परिवर्तित होते हैं) एक बार जब वे अधिभार सेट में जोड़ दिए गए हैं (जैसा कि ऊपर स्थापित किया गया है), उनमें से एक के तर्क के लिए रूपांतरण अनुक्रम प्रदान किया गया वे दूसरे के तर्कों के लिए रूपांतरण क्रम से बेहतर हैं (जो, कब्ज के कारण, इस उदाहरण में मामला है)।

मानक बताता है:

इन परिभाषाओं को देखते हुए, एक व्यवहार्य फ़ंक्शन F1 को अन्य व्यवहार्य फ़ंक्शन F2 की तुलना में एक बेहतर फ़ंक्शन के रूप में परिभाषित किया जाता है यदि सभी तर्कों के लिए, ICSi (F1) ICSi (F2) की तुलना में एक बदतर रूपांतरण अनुक्रम नहीं है, और फिर

  • कुछ तर्क j के लिए, ICSj (F1) ICSj (F2) की तुलना में बेहतर रूपांतरण अनुक्रम है, या, यदि नहीं, तो
  • संदर्भ उपयोगकर्ता द्वारा परिभाषित रूपांतरण और प्रारंभिक रूपांतरण क्रम से एफ 1 के रिटर्न प्रकार से गंतव्य के प्रकार (यानी, इकाई के प्रकार को आरंभीकृत किया जा रहा है) का एक प्रारंभिक रूपांतरण है, जो रिटर्न प्रकार से मानक रूपांतरण अनुक्रम की तुलना में बेहतर रूपांतरण अनुक्रम है। गंतव्य प्रकार के लिए F2 की।

§13.3.3 [over.match.best]

इस मामले में, केवल एक तर्क (अंतर्निहित thisपैरामीटर) है। रूपांतरण दृश्य के लिए B2 &=> B2 &(कॉल करने के लिए operator int) बेहतर है करने के लिए B2 &=> const B2 &(कॉल करने के लिए operator bool), और इसलिए operator intतथ्य यह है कि यह वास्तव में करने के लिए सीधे परिवर्तित नहीं करता है के संबंध के बिना अधिभार सेट से चयन किया जाता है bool


2
आप N3337, जो था (मेरा मानना है कि) सी ++ 11 के बाद पहला मसौदा प्राप्त कर सकते हैं, और केवल बहुत, बहुत मामूली परिवर्तन भी शामिल यहाँ मुक्त करने के लिए। मानक के उचित भाग को खोजने के लिए, यह आमतौर पर पीडीएफ के वर्गों को पहचानने की बात है, जहां चीजें हैं (चीजों को देखकर / मानक का हवाला देते हुए), और CTRL + F के साथ प्रासंगिक कीवर्ड की खोज करना।
राबर्ट एलन हेनिगन लेहि

1
@ शेख मुझे वर्तमान C या C ++ मानक दस्तावेज़ कहां मिलेंगे ? इसके लिए सबसे अच्छा सवाल है और जहां तक ​​मुझे पता है कि सभी ड्राफ्ट कवर किए गए हैं जो C और C ++ दोनों के लिए उपलब्ध हैं।
शफीक यघमौर

2
यही कारण है कि मैंने कहा "केवल यह निर्धारित करने के बाद लागू किया जाता है कि कौन सा रूपांतरण अनुक्रम बेहतर है"। फिर भी, मुझे लगता है कि यह उत्तर का एक महत्वपूर्ण हिस्सा है: वहाँ (सिद्धांत में) निहित वस्तु तर्क के रूपांतरण और "वापसी प्रकार के रूपांतरण" के बीच संघर्ष है, और यह अधिभार संकल्प के विभिन्न चरणों द्वारा स्पष्ट रूप से हल किया गया है। [over.match.best] /1.4 स्पष्ट रूप से उन चरणों के अलगाव को इंगित करता है, और अंतिम मानक रूपांतरण अनुक्रम इस मामले में परवाह क्यों नहीं करता है।
dp

2
मैंने आपके सुझाव को शामिल करने के उत्तर को संपादित किया, इस पर विस्तार करते हुए कि "सर्वश्रेष्ठ" का चयन करते समय इन रूपांतरण ऑपरेटरों के रिटर्न प्रकार पर विचार क्यों नहीं किया जाता है।
रॉबर्ट एलन हेनिगन लेहि

2
@RobertAllanHenniganLeahy चूंकि यह प्रश्न का बिंदु था, क्या यह उत्तर में कहीं दिखाई नहीं देना चाहिए, न कि केवल एक टिप्पणी में?
बरमार

9

कम

रूपांतरण फ़ंक्शन operator int()का चयन क्लैंग ओवर द्वारा किया गया है operator bool() constक्योंकि bकांस्ट योग्य नहीं है, जबकि बूल के लिए रूपांतरण ऑपरेटर है।

संक्षिप्त तर्क यह है कि उम्मीदवार ओवरलोड रिज़ॉल्यूशन के लिए कार्य करते हैं (स्थान में निहित वस्तु पैरामीटर के साथ), जब इसे परिवर्तित bकिया boolजा रहा है

operator bool (B2 const &);
operator int (B2 &);

जहां दूसरा एक बेहतर मैच है क्योंकि bकांस्ट क्वालिफाइड नहीं है।

यदि दोनों फ़ंक्शन समान योग्यता साझा करते हैं (दोनों constया तो नहीं), तो operator boolइसका चयन किया जाता है क्योंकि यह प्रत्यक्ष रूपांतरण प्रदान करता है।

कास्ट-नोटेशन के माध्यम से रूपांतरण, कदम से कदम का विश्लेषण किया

अगर हम सहमत हैं कि बूलियन ostream Inserter (std :: basic_ostream :: ऑपरेटर << (bool वैल) [ostream.inserters.arithmetic] के अनुसार) मूल्य के साथ कहा जाता है इस बात का एक रूपांतरण से परिणाम bके लिए boolहम उस रूपांतरण में खुदाई कर सकते हैं ।

1. कलाकारों की अभिव्यक्ति

B से बूल की डाली

(bool)b

का मूल्यांकन करता है

static_cast<bool>(b)

के अनुसार सी ++ 11, 5.4 / 4 [expr.cast] के बाद से const_cast(नहीं जोड़ने या यहाँ स्थिरांक को हटाने) लागू नहीं है।

यह स्थिर रूपांतरण प्रति C ++ 11, 5.2.9 / 4 [expr.static.cast] की अनुमति है , अगर bool t(b);एक आविष्कार किया गया चर टी अच्छी तरह से बनता है। इस तरह के बयानों को C - 11, 8.5 / 15 [dcl.init] के अनुसार प्रत्यक्ष-आरंभ कहा जाता है ।

2. प्रत्यक्ष आरंभीकरण bool t(b);

सबसे कम उल्लिखित मानक पैराग्राफ राज्यों के खंड 16 (जोर मेरा):

आरम्भिकों के शब्दार्थ इस प्रकार हैं। डेस्टिनेशन टाइप, ऑब्जेक्ट या रेफरेंस को इनिशियलाइज़ किए जाने का प्रकार होता है और सोर्स टाइप इनिशियलाइज़र एक्सप्रेशन का प्रकार होता है।

[...]

[...] यदि स्रोत प्रकार एक (संभवतः cv-योग्य) वर्ग प्रकार है, तो रूपांतरण कार्यों पर विचार किया जाता है।

लागू रूपांतरण कार्यों की गणना की जाती है, और सबसे अच्छा एक अधिभार संकल्प के माध्यम से चुना जाता है।

2.1 कौन से रूपांतरण कार्य उपलब्ध हैं?

उपलब्ध रूपांतरण फ़ंक्शन हैं operator int ()और operator bool() constचूंकि C ++ 11, 12.3 / 5 [class.conv] हमें बताता है:

एक व्युत्पन्न वर्ग में एक रूपांतरण फ़ंक्शन एक बेस क्लास में रूपांतरण फ़ंक्शन को नहीं छुपाता है जब तक कि दो फ़ंक्शन एक ही प्रकार में परिवर्तित नहीं होते हैं।

जबकि C ++ 11, 13.3.1.5/1 [over.match.conv] बताता है:

एस और उसके आधार वर्गों के रूपांतरण कार्यों पर विचार किया जाता है।

जहाँ S वह वर्ग है जहाँ से परिवर्तित किया जाएगा।

2.2 कौन से रूपांतरण कार्य लागू हैं?

C ++ 11, 13.3.1.5/1 [over.match.conv] (जोर मेरा):

1 [...] यह मानते हुए कि "cv1 T" ऑब्जेक्ट के प्रकार को इनिशियलाइज़ किया जा रहा है, और "cv S" इनिशियललाइज़र एक्सप्रेशन का प्रकार है, S के साथ एक वर्ग प्रकार, उम्मीदवार फ़ंक्शंस निम्नानुसार चुने जाते हैं: रूपांतरण एस और इसके आधार वर्गों के कार्यों पर विचार किया जाता है। वे गैर-स्पष्ट रूपांतरण फ़ंक्शंस जो S और उपज प्रकार T के भीतर छिपे नहीं हैं या एक मानक रूपांतरण अनुक्रम के माध्यम से T टाइप करने के लिए परिवर्तित किया जा सकता है उम्मीदवार कार्य हैं।

इसलिए operator bool () constलागू है क्योंकि यह भीतर छिपा नहीं है B2और पैदावार करता है a bool

अंतिम मानक उद्धरण में जोर देने वाला भाग operator int ()चूंकि रूपांतरण का उपयोग करने के लिए प्रासंगिक intहै, एक प्रकार है जिसे मानक रूपांतरण अनुक्रम के माध्यम से बूल में परिवर्तित किया जा सकता है। से रूपांतरण intकरने के लिए boolभी नहीं एक दृश्य लेकिन एक सादे प्रत्यक्ष रूपांतरण जो प्रति अनुमति दी है है सी ++ 11, 4.12 / 1 [conv.bool]

अंकगणित, अनकैप्ड एन्यूमरेशन, पॉइंटर या पॉइंटर टू मेंबर टाइप के प्रील्यूव को टाइप बूल के प्रीलव्यू में बदला जा सकता है। शून्य मान, अशक्त सूचक मान या अशक्त सदस्य सूचक मान मिथ्या में परिवर्तित हो जाता है; किसी अन्य मान को सत्य में परिवर्तित किया जाता है।

इसका मतलब है कि operator int ()यह लागू है।

2.3 किस रूपांतरण समारोह का चयन किया जाता है?

ओवरलोड रेजोल्यूशन ( C ++ 11, 13.3.1.5/1 [over.match.conf] ) के माध्यम से उपयुक्त रूपांतरण फ़ंक्शन का चयन किया जाता है :

ओवरलोड रिज़ॉल्यूशन का उपयोग रूपांतरण फ़ंक्शन का चयन करने के लिए किया जाता है।

जब क्लास के सदस्य कार्यों के लिए अधिभार संकल्प की बात आती है, तो एक विशेष "क्विक" होता है: निहित वस्तु पैरामीटर "।

प्रति C ++ 11, 13.3.1 [over.match.funcs] ,

[...] दोनों स्थिर और गैर-स्थैतिक सदस्य कार्यों में एक अंतर्निहित वस्तु पैरामीटर है [...]

गैर-स्थैतिक सदस्य कार्यों के लिए इस पैरामीटर का प्रकार-क्लाज 4- के लिए-रिकॉर्डिंग कहां है:

  • रेफरी-क्वालीफायर के बिना या & रेफरी-क्वालीफायर के साथ घोषित किए गए कार्यों के लिए "cv X के लिए लैवल्यू संदर्भ"

  • & Lt; ref- क्वालिफायर के साथ घोषित कार्यों के लिए "Cv ​​X के लिए संदर्भ"

जहाँ X वह वर्ग है जिसमें फ़ंक्शन एक सदस्य है और cv सदस्य फ़ंक्शन घोषणा पर cv-योग्यता है।

इसका मतलब यह है कि (प्रति C ++ 11, 13.3.1.5/2 [over.match.conv] ), रूपांतरण सूची के आरंभ में,

[t] उन्होंने तर्क सूची में एक तर्क दिया है, जो कि आरम्भिक अभिव्यक्ति है। [नोट: इस तर्क की तुलना रूपांतरण कार्यों के निहित वस्तु पैरामीटर के खिलाफ की जाएगी। ध्यान दें]

अधिभार संकल्प के लिए उम्मीदवार कार्य कर रहे हैं:

operator bool (B2 const &);
operator int (B2 &);

जाहिर है, operator int ()एक बेहतर मैच है अगर योग्यता रूपांतरण के लिए आवश्यक रूप B2से गैर-स्थिर ऑब्जेक्ट का उपयोग करके रूपांतरण का अनुरोध किया जाता है operator bool ()

यदि दोनों रूपांतरण फ़ंक्शंस एक ही कॉन्स्टेबल योग्यता साझा करते हैं, तो उन फ़ंक्शन का अधिभार रिज़ॉल्यूशन चाल नहीं करेगा। इस स्थिति में, रूपांतरण (अनुक्रम) रैंकिंग जगह में आती है।

3. क्यों operator bool ()चुना जाता है जब दोनों रूपांतरण फ़ंक्शन एक ही कॉन्स्टेबल योग्यता साझा करते हैं?

से रूपांतरण B2करने के लिए boolएक उपयोगकर्ता-निर्धारित रूपांतरण अनुक्रम (है सी ++ 11, 13.3.3.1.2 / 1 [over.ics.user] )

एक उपयोगकर्ता-परिभाषित रूपांतरण अनुक्रम में एक प्रारंभिक मानक रूपांतरण अनुक्रम होता है, जिसके बाद उपयोगकर्ता-निर्धारित रूपांतरण होता है और उसके बाद दूसरा मानक रूपांतरण अनुक्रम होता है।

[...] यदि उपयोगकर्ता-परिभाषित रूपांतरण एक रूपांतरण फ़ंक्शन द्वारा निर्दिष्ट किया गया है, तो प्रारंभिक मानक रूपांतरण अनुक्रम स्रोत प्रकार को रूपांतरण फ़ंक्शन के अंतर्निहित ऑब्जेक्ट पैरामीटर में परिवर्तित करता है।

C ++ 11, 13.3.3.2/3 [over.ics.rank]

[...] बेहतर रूपांतरण अनुक्रम और बेहतर रूपांतरण के आधार पर निहित रूपांतरण अनुक्रमों के आंशिक क्रम को परिभाषित करता है।

[...] उपयोगकर्ता-परिभाषित रूपांतरण अनुक्रम U1 एक अन्य उपयोगकर्ता-परिभाषित रूपांतरण अनुक्रम U2 की तुलना में बेहतर रूपांतरण अनुक्रम है, यदि उनमें एक ही उपयोगकर्ता-निर्धारित रूपांतरण फ़ंक्शन या कंस्ट्रक्टर या समग्र आरंभ होता है और U1 का दूसरा मानक रूपांतरण अनुक्रम इससे बेहतर है U2 का दूसरा मानक रूपांतरण अनुक्रम।

दूसरा मानक रूपांतरण मामले की है operator bool()है boolके boolमामले में (पहचान रूपांतरण) जबकि दूसरा मानक रूपांतरण की operator int ()है intकरने के लिए boolजो एक बूलियन रूपांतरण है।

इसलिए, रूपांतरण अनुक्रम, का उपयोग operator bool ()करना बेहतर है, यदि दोनों रूपांतरण फ़ंक्शन एक ही कॉन्स्टेबल योग्यता साझा करते हैं।


ज्यादातर मामलों में, यह काफी सहज है कि आप परिणाम के साथ क्या करते हैं यह प्रभावित नहीं करता है कि यह कैसे गणना की जाती है। हम कैसे गणना a/bकरते हैं वह वही है चाहे कोड हो float f = a/b;या int f = a/b;। लेकिन यह एक ऐसा मामला है जहां यह थोड़ा आश्चर्यजनक हो सकता है।
डेविड श्वार्ट्ज

1

C ++ बूल प्रकार के दो मूल्य होते हैं - संबंधित मान 1 और 0. के साथ सही और गलत। अंतर्निहित भ्रम से बचा जा सकता है यदि आप B2 वर्ग में एक बूल ऑपरेटर जोड़ते हैं जो बेस क्लास (B) के बूल ऑपरेटर को स्पष्ट रूप से कॉल करता है, तो आउटपुट आता है असत्य है। यहाँ मेरा संशोधित कार्यक्रम है। फिर ऑपरेटर बूल का अर्थ है ऑपरेटर बूल और किसी भी तरह से ऑपरेटर इंट नहीं।

#include <iostream>

class B {
public:
    operator bool() const {
        return false;
    }
};

class B2 : public B {
public:
    operator int() {
        return 5;
    }
    operator bool() {
        return B::operator bool();
    }
};

int main() {
    B2 b;
    std::cout << std::boolalpha << (bool)b << std::endl;
}

आपके उदाहरण में, (बूल) b, B2 के लिए बूल ऑपरेटर को कॉल करने की कोशिश कर रहा था, B2 को बूल ऑपरेटर विरासत में मिला है, और प्रभुत्व नियम से, इंट ऑपरेटर, int ऑपरेटर को कॉल किया जाता है और B2 में विरासत में मिला बूल ऑपरेटर। हालांकि, बी 2 क्लास में स्पष्ट रूप से एक बूल ऑपरेटर होने से, समस्या हल हो जाती है।


8
यह प्रोग्राम लिखने का एक अच्छा समाधान है, लेकिन इसका जवाब नहीं है कि यह अजीब बात क्यों होती है।
--खबर

4
true and false with corresponding values 1 and 0यह एक निरीक्षण है। trueपूर्णांक में कनवर्ट करता है 1, लेकिन इसका मतलब यह नहीं है कि इसका "" मूल्य है 1। वास्तव में, नीचे trueहो सकता 42है।
ऑर्बिट

बी 2 में स्पष्ट बूल ऑपरेटर होने से बी 2, ऑपरेटर इंट या ऑपरेटर बूल में जो कहा जाता है वह भ्रम और संकलक निर्भरता से बचा जाता है।
डॉ। देबाशीष जन

कोई कंपाइलर निर्भरता नहीं है। मानक के लिए आवश्यक है कि 0 गलत में रूपांतरित हो और 1 सत्य में परिवर्तित हो।
पिल्ला

1
@LightnessRacesinOrbit इस बिंदु पर अधिक, शायद: boolकभी भी मान 0 या 1 नहीं है; एकमात्र मान जो इसे ले सकता है falseऔर true(जो 0 और 1 boolमें परिवर्तित हो जाता है यदि अभिन्न प्रकार में परिवर्तित हो जाता है)।
जेम्स कंज

0

पिछले जवाबों में से कुछ, पहले से ही बहुत सारी जानकारी प्रदान करते हैं।

मेरा योगदान है, "कास्ट ऑपरेशन" को "ओवरलोड ऑपरेशन" के समान संकलित किया जाता है, मैं प्रत्येक ऑपरेशन के लिए एक विशिष्ट पहचानकर्ता के साथ एक फ़ंक्शन बनाने का सुझाव देता हूं, और बाद में, इसे आवश्यक ऑपरेटर या कास्ट द्वारा प्रतिस्थापित करता हूं।

#include <iostream>

class B {
public:
    bool ToBool() const {
        return false;
    }
};

class B2 : public B {
public:
    int ToInt() {
        return 5;
    }
};

int main() {
    B2 b;
    std::cout << std::boolalpha << b.ToBool() << std::endl;
}

और, बाद में, ऑपरेटर या कास्ट लागू करें।

#include <iostream>

class B {
public:
    operator bool() {
        return false;
    }
};

class B2 : public B {
public:
    operator int() {
        return 5;
    }
};

int main() {
    B2 b;
    std::cout << std::boolalpha << (bool)b << std::endl;
}

बस मेरे 2 सेंट।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.