मेरा हालिया उत्तर, What other useful casts can be used in C++ पर हालिया उत्तरों पर कई टिप्पणियां बताती हैं कि सी ++ रूपांतरणों की मेरी समझ दोषपूर्ण है।सी ++ निहित रूपांतरण
#include <string>
struct A {
A(const std::string & s) {}
};
void func(const A & a) {
}
int main() {
func("one"); // error
func(A("two")); // ok
func(std::string("three")); // ok
}
मेरे दावा है कि पहले समारोह कॉल एक त्रुटि है, becauuse वहाँ एक ए के लिए एक स्थिरांक चार * से कोई रूपांतरण वहाँ से एक रूपांतरण है था: बस मुद्दा स्पष्ट करने के लिए, निम्नलिखित कोड पर विचार एक ए के लिए एक स्ट्रिंग, लेकिन इसका उपयोग एक से अधिक रूपांतरण शामिल होगा। मेरी समझ यह है कि इसकी अनुमति नहीं है, और ऐसा लगता है कि यह g ++ 4.4.0 & Comau कंपाइलर्स द्वारा पुष्टि की जाती है। Comeau के साथ, मैं निम्नलिखित त्रुटि मिलती है: आप का कहना है, तो कर सकते हैं, जहां मैं गलत हूँ, यहां पर अथवा मूल जवाब में, अधिमानतः सी ++ मानक के संदर्भ में
"ComeauTest.c", line 11: error: no suitable constructor exists
to convert from "const char [4]" to "A"
func("one"); // error
, तो कृपया। उद्धरण प्रदान करने के लिए
At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.
अभय के लिए धन्यवाद:
और सी ++ मानक से जवाब हो रहा है।
मुझे खेद है कि मैं आपके उत्तर में टिप्पणी में सभी गलत था। मैंने पढ़ा है "ओवरलोड रिज़ॉल्यूशन का उपयोग उपयोगकर्ता द्वारा परिभाषित रूपांतरण को चुनने के लिए किया जाता है।", और मैंने खुद को 'अच्छी तरह से कहा, तो यह ए (स्ट्रिंग कॉन्स और) को हल करेगा और इसे "एक" पास करेगा, लेकिन मैं पूरी तरह असफल रहा 13.3.3.1.2 के बारे में सोचने के लिए: "उपयोगकर्ता द्वारा परिभाषित रूपांतरण अनुक्रम में प्रारंभिक मानक रूपांतरण अनुक्रम होता है जिसके बाद उपयोगकर्ता परिभाषित रूपांतरण (12.3) होता है जिसके बाद दूसरा मानक रूपांतरण अनुक्रम होता है।" लेकिन "एक" -> स्ट्रिंग एक मानक रूपांतरण अनुक्रम नहीं होगा, लेकिन किसी अन्य उपयोगकर्ता परिभाषित रूपांतरण अनुक्रम की आवश्यकता है! –
बस जब तक मैं अपने पत्थर खो नहीं रहा हूं :-) –
महान सवाल! चर्चा का तात्पर्य है कि 'std :: string' भाषा का हिस्सा नहीं है और इसके द्वारा रूपांतरण "उपयोगकर्ता परिभाषित" हैं। कम से कम यह मेरी समझ है, अगर मैं गलत हूं तो मुझे सही करें। यह अच्छा होगा अगर सवाल इस बारे में अधिक स्पष्ट था। 'Std :: string' की सटीक स्थिति पुरानी सी ++ हाथों के लिए क्रिस्टल-स्पष्ट हो सकती है, लेकिन इस शताब्दी में भाषा में आने वाले लोगों के लिए एहसास करना इतना आसान नहीं है। –