2009-07-19 13 views
14

को देखते हुए निम्न विधियों:एक उद्धृत स्ट्रिंग एक std :: स्ट्रिंग से पहले बूल विधि हस्ताक्षर क्यों मेल खाता है?

// Method 1 
void add(const std::string& header, bool replace); 

//Method 2 
void add(const std::string& name, const std::string& value); 

ऐसा लगता है कि निम्नलिखित कोड विधि 2 के बजाय विधि 1 बुला खत्म हो जाएगा:

something.add("Hello", "World"); 

मैं एक और तरीका है कि इस तरह दिखता है बना दी:

//Method 3 
void MyClass::add(const char* name, const char* value) { 
    add(std::string(name), std::string(value)); 
} 

यह काम किया। तो यह प्रतीत होता है कि जब एक विधि एक "उद्धृत स्ट्रिंग" स्वीकार करता है यह निम्न क्रम में मिलान हो जाएगा:

  1. const char*
  2. bool
  3. std::string

एक उद्धृत स्ट्रिंग क्यों व्यवहार किया जाएगा के रूप में std::string से पहले? क्या यह सामान्य व्यवहार है? मैंने इस परियोजना के लिए एक सभ्य राशि लिखी है और गलत विधि हस्ताक्षर के साथ कोई अन्य समस्या नहीं है ...

उत्तर

14

मेरा अनुमान है कि पॉइंटर से बूल का रूपांतरण एक अंतर्निहित आदिम प्रकार रूपांतरण है, जहां std::string में रूपांतरण के लिए एक कन्स्ट्रक्टर की कॉल और अस्थायी निर्माण की आवश्यकता है।

+2

यह है। मुझे एक बार यह समस्या थी और यह मुझे उलझन में डाल दिया, लेकिन आपका दूसरा पैरामीटर एक कॉन्स char * है, और इसे एक बूलियन में परिवर्तित कर दिया जाएगा। – GManNickG

6

पॉइंटर्स का bool पर एक निहित रूपांतरण है। शायद आप को देखा है निम्नलिखित:

void myFunc(int* a) 
{ 
    if (a) 
     ++(*a); 
} 

अब, सी ++ में, के बीच में निर्मित प्रकार वर्ग प्रकार के बीच रूपांतरण से प्राथमिकता दी जाती अंतर्निहित रूपांतरण। उदाहरण के लिए, यदि आप एक वर्ग था:

class Int 
{ 
public: 
    Int(int i) {} 
} 

और तुम एक समारोह long और Int के लिए अतिभारित:

void test(long n) {cout << "long";} 
void test(Int n) {cout << "Int";} 

आपको लगता है कि निम्नलिखित कोड लंबे अधिभार कॉल देखेंगे:

int i; 
test(i); 
+0

ध्यान दें कि मानक द्वारा परिभाषित होने के बावजूद std :: string "उपयोगकर्ता-परिभाषित" भी है। मुझे लगता है कि अधिक उपयुक्त शब्द "वर्ग प्रकार" बनाम "गैर-वर्ग प्रकार" है। – MSalters

+0

अच्छा बिंदु। संपादित। – rlbond

9

आपके मामले में आपके पास ओवरलोडेड फ़ंक्शन हैं। ओवरलोडिंग रिज़ॉल्यूशन धारा 13.3 के अनुसार होता है।

सी ++ 03 13.3.3.2/2:

जब अंतर्निहित रूपांतरण दृश्यों के बुनियादी रूपों
की तुलना (के रूप में 13.3.3.1 में परिभाषित) - एक मानक रूपांतरण अनुक्रम (13.3.3.1 .1) उपयोगकर्ता द्वारा परिभाषित रूपांतरण अनुक्रम या एक इलिप्सिस रूपांतरण अनुक्रम से बेहतर रूपांतरण अनुक्रम है, और
- उपयोगकर्ता द्वारा परिभाषित रूपांतरण अनुक्रम (13.3.3.1.2) एक इलिप्सिस रूपांतरण अनुक्रम (13.3) से बेहतर रूपांतरण अनुक्रम है .3.1.3)।

बूल में रूपांतरण सूचक मानक मानक रूपांतरण है। Std :: स्ट्रिंग में रूपांतरण सूचक एक उपयोगकर्ता द्वारा परिभाषित रूपांतरण है।

4,12 बूलियन रूपांतरण सदस्य प्रकार के गणित, गणन का एक rvalue, सूचक, या सूचक के प्रकार bool एक rvalue करने के लिए परिवर्तित किया जा सकता है। शून्य मान, शून्य सूचक मान, या शून्य सदस्य सूचक मान को गलत में परिवर्तित किया जाता है; कोई अन्य मूल्य सत्य में परिवर्तित हो जाता है।

संबंधित मुद्दे