मेरे पास कक्षा C
है जिसमें किसी भी चीज़ का कास्टिंग ऑपरेटर है। उदाहरण में मैंने std::string
पर तीन अलग-अलग तरीकों से इसका उदाहरण डालने की कोशिश की: static_cast
, std::string
का कन्स्ट्रक्टर और std::string
को असाइन करना। हालांकि, केवल अंतिम एक संकलन करता है, जबकि अन्य संदिग्ध कन्स्ट्रक्टर की त्रुटि उठाते हैं।स्पष्ट कलाकारों, प्रत्यक्ष प्रारंभिकरण और प्रति प्रारंभिकरण के बीच अलग-अलग व्यवहार
त्रुटि का कारण पर्याप्त स्पष्ट है: C
को std::string
के निर्माता को स्वीकार करने के कई तरीके हैं। लेकिन इन मामलों के बीच क्या अंतर है? क्यों कास्ट ऑपरेटर यहां इरादे के रूप में काम करता है लेकिन वहां नहीं?
struct C {
template<typename T>
operator T() const {
return T{};
}
};
int main() {
C c;
cout << static_cast<string>(c) << endl; // compile error
string bad(c); // compile error
string ok = c; // compiles successfully
}
युपीडी: टिप्पणी में उल्लेख किया bolov के रूप में, इस मुद्दे के साथ सी ++ 17 पुन: पेश नहीं करता है। मैंने इसे g ++ - 5 और clang-3.8 के साथ -std = C++ 11 और -std = C++ 14 के साथ परीक्षण किया, और यह वर्णित त्रुटियों को दिखाता है।
पुन: पेश नहीं कर सकते: https://godbolt.org/g/ESR8cw – bolov
@bolov अजीब पर्याप्त है, लेकिन यह सी ++ 17 में पुन: पेश नहीं करता है। यह godbolt पर -std = C++ 11 के साथ पुनरुत्पादित करता है। मैं इसे पोस्ट में जोड़ दूंगा, धन्यवाद। –
हम्म .. दिलचस्प – bolov