2011-11-23 14 views
77

यह कीवर्ड explicit एक वस्तु बनाने जब यह प्रोग्रामर की पहली इरादा नहीं था से एक उत्साही संकलक रोकता जोड़ने कंस्ट्रक्टर्स की बात आती है, जब। क्या यह तंत्र ऑपरेटरों को कास्टिंग के लिए भी उपलब्ध है?क्या एक कास्ट ऑपरेटर स्पष्ट हो सकता है?

struct Foo 
{ 
    operator std::string() const; 
}; 

यहाँ, उदाहरण के लिए, मैं एक std::string में Foo कास्ट करने के लिए सक्षम होने के लिए चाहते हैं, लेकिन मैं परोक्ष होने ऐसे डाली नहीं करना चाहती।

उत्तर

94

हाँ और नहीं।

यह निर्भर करता है जो सी ++ के संस्करण के, आप उपयोग कर रहे।

  • सी ++ 98 और सी ++ 03 explicit जैसे रूपांतरण ऑपरेटरों
  • लेकिन सी ++ 11 करता है समर्थन नहीं करते।

उदाहरण के लिए,

struct A 
{ 
    //implicit conversion to int 
    operator int() { return 100; } 

    //explicit conversion to std::string 
    explicit operator std::string() { return "explicit"; } 
}; 

int main() 
{ 
    A a; 
    int i = a; //ok - implicit conversion 
    std::string s = a; //error - requires explicit conversion 
} 

g++ -std=c++0x के साथ संकलित करें, तो आप इस त्रुटि प्राप्त होगी:

prog.cpp:13:20: error: conversion from 'A' to non-scalar type 'std::string' requested

ऑनलाइन डेमो: http://ideone.com/DJut1

लेकिन जैसे ही आप लिखते हैं:

std::string s = static_cast<std::string>(a); //ok - explicit conversion 

त्रुटि दूर चला जाता है: Btw http://ideone.com/LhuFd

, सी ++ 11 में, स्पष्ट रूपांतरण ऑपरेटर के रूप में "प्रासंगिक रूपांतरण ऑपरेटर" अगर यह बूलियन में धर्मान्तरित करने के लिए जाना जाता है।

आशा है कि मदद करता है: इसके अलावा, अगर आप अंतर्निहित और स्पष्ट रूपांतरण के बारे में अधिक जानना चाहते हैं, इस विषय में पढ़ा।

+1

+1। कृपया सी ++ 11 कोड का उदाहरण पोस्ट कर सकते हैं? – FailedDev

+1

@ फ़ेलडेव: हो गया। :-) – Nawaz

+1

बहुत अच्छा धन्यवाद! – FailedDev