2012-01-25 13 views
5

मैं सिर्फ एक समारोह लिखा है:std :: string इस चाल का प्रबंधन कैसे करता है?

void doSomeStuffWithTheString(const std::string& value) { 
... 
std::string v = value; 
std::cout << value.c_str(); 
... 
} 

लेकिन तब मैं

doSomeStuffWithTheString("foo"); 

के साथ इस फोन है और यह काम करता है। तो मैंने सोचा होगा कि यह काम करने के लिए (एक कॉन्स char * std :: स्ट्रिंग के एक अंतर्निहित उदाहरण को शुरू करने के लिए) मूल्य को मूल्य से पारित करना होगा, लेकिन इस मामले में (कॉन्स) संदर्भ द्वारा पारित किया जाना चाहिए।

किसी भी मौके से संदर्भित होने पर कॉन्स्ट char * से तत्काल अस्थायी अस्थायी std :: स्ट्रिंग है? यदि नहीं, तो यह संभवतः कैसे काम करता है?

संपादित

अगर समारोह

void doSomeStuffWithTheString(const char* value); 

जो एक संकलक का चयन करेंगे के साथ ओवरलोड हो गया है क्या होता है?

+0

आपने बहुत अधिक अपने प्रश्न का उत्तर दिया :) – pezcode

+0

दिलचस्प, उसे नहीं पता था। ऑब्जेक्ट को ऐसा करने की क्या ज़रूरत है, ऐसे अंतर्निहित रचनाकारों को कॉन्स-बाय-रेफ कॉल (और इससे कैसे बचें?) – lurscher

+1

प्रोग्राम खराब है: 'std :: string = value;' मान्य नहीं है और अपने कंपाइलर द्वारा खारिज किया जाना चाहिए। –

उत्तर

7

std::string प्रकार const char* से एक अंतर्निहित रूपांतरण (कन्स्ट्रक्टर के माध्यम से) है। यह std::string में कनवर्ट करने के लिए स्ट्रिंग शाब्दिक "foo" को अनुमति देता है। इसका परिणाम अस्थायी मूल्य में होता है। सी ++ में const & एक अस्थायी मूल्य के लिए कानूनी है और इसलिए यह सब एक साथ रखता है।

सी ++ में अपने स्वयं के कस्टम प्रकारों का उपयोग करके इस चाल को दोहराना संभव है।

class Example { 
public: 
    Example(const char* pValue) {} 
}; 

void Method(const Example& e) { 
    ... 
} 

Method("foo"); 
0

हां, एक अस्थायी std::string स्ट्रिंग अक्षर से बनाया गया है।

0

वास्तव में, std::string डिफ़ॉल्ट निर्माता

0

का उपयोग कर "मूल्य मूल्य द्वारा पारित करना होगा, लेकिन इस मामले में से (स्थिरांक) संदर्भ पारित हो जाता है।"

एक सी ++ सुविधा जहां यह एक अस्थायी मूल्य पारित करने के लिए संभव है नहीं है (इस मामले में, एक अस्थायी std::string परोक्ष const char * से परिवर्तित) स्थिरांक-संदर्भ की एक बहस करने के लिए (इस मामले में, const std::string &) टाइप करें।

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