मैंने रूपांतरण से संबंधित कई प्रश्नों के माध्यम से ब्राउज़ किया है, लेकिन ऐसा लगता है कि उनमें से कोई भी इस तरह से स्पष्ट कीवर्ड के बारे में चर्चा नहीं कर रहा था।(स्पष्ट शामिल) ऑपरेटर और कन्स्ट्रक्टर रूपांतरण के साथ प्राथमिकता
struct B;
struct A{
/*explicit*/ A(const B&){ cout << 1; } // *1
};
struct B{
/*explicit*/ operator A()const{ cout << 2; } // *2
};
void foo(const A &){}
int main(void){
B b;
foo(/*static_cast<A>*/ (b)); // *3
}
परिणाम:: (Y: uncommented, न: टिप्पणी की, एक्स: या तो) कोड यह
# | *1 | *2 | *3 |output|
1 | N | N | N |error |
2 | N | N | Y | 1 |
3 | N | Y | N | 1 |
4 | N | Y | Y | 1 |
5 | Y | N | N | 2 |
6 | Y | N | Y | 1 |
7 | Y | Y | N |error |
8 | Y | Y | Y | 1 |
1, 7 त्रुटियों अस्पष्ट हैं, जो सामान्य है (और कोई ऑटो रूपांतरण।)
2 ऐसा लगता है कि कन्स्ट्रक्टर की उच्च प्राथमिकता है, लेकिन क्यों?
3, 5 समझने में आसान हैं।
4 अजीब है क्योंकि यह स्पष्ट को कॉल नहीं करता है। क्यूं कर?
6 'स्पष्ट' या कन्स्ट्रक्टर के कारण उच्च प्राथमिकता हो सकता है। कौन सा कारण है? 8 ऐसा लगता है कि कन्स्ट्रक्टर की उच्च प्राथमिकता है, लेकिन क्यों?
क्या कोई कुछ स्पष्टीकरण दे सकता है? धन्यवाद!
यह नियम के अंगूठे का एक कारण है कि आपके पास कनवर्टिंग कन्स्ट्रक्टर और एक रूपांतरण ऑपरेटर दोनों नहीं होना चाहिए - आपको शायद ही कभी यह सही लगे।और जब आप करते हैं, बहुत कम लोग समझते हैं क्यों। –
@ बोपरसन, मुझे यह पता है। मैं इस बारे में उत्सुक हूं कि संकलक इस तरह क्यों काम करता है। यह एक व्यावहारिक सवाल नहीं है, मुझे पता है। धन्यवाद – Asu