इस कोड पर विचार करें,अंतर्निहित रूपांतरण: स्थिरांक संदर्भ बनाम गैर-स्थिरांक संदर्भ बनाम गैर-संदर्भ
struct A {};
struct B { B(const A&) {} };
void f(B)
{
cout << "f()"<<endl;
}
void g(A &a)
{
cout << "g()" <<endl;
f(a); //a is implicitly converted into B.
}
int main()
{
A a;
g(a);
}
यह compiles fine, ठीक चलाता है। लेकिन अगर मैं f(B)
से f(B&)
बदलता हूं, तो यह doesn't compile है। अगर मैं f(const B&)
लिखता हूं, तो यह फिर से compiles fine, ठीक चलाता है। कारण और तर्क क्यों है?
सारांश:
void f(B); //okay
void f(B&); //error
void f(const B&); //okay
मैं भाषा विनिर्देश से कारण हैं, तर्क और संदर्भ (रों) सुनने के लिए, इन मामलों में से प्रत्येक के लिए करना चाहते हैं। बेशक, फ़ंक्शन हस्ताक्षर स्वयं गलत नहीं हैं। इसके बजाय A
स्पष्ट रूप से B
और const B&
में परिवर्तित हो गया है, लेकिन B&
में नहीं है, और यह संकलन त्रुटि का कारण बनता है।
एक दिलचस्प बात: एआरएम में, प्राथमिक अभिव्यक्ति के लिए lvalueness का निर्धारण निम्नानुसार है: "परिणाम पहचानकर्ता है अगर परिणाम एक लालसा है।" .. "परिणाम सदस्य है यदि परिणाम है।" मैंने सोचा है कि बिल्ली का मतलब क्या होना चाहिए, क्योंकि यह भी परिभाषित करता है "एक लालच एक वस्तु या कार्य का जिक्र करते हुए एक अभिव्यक्ति है।" हम्म, शायद इसका मतलब यह है कि "परिणाम एक आभासी है यदि यह किसी ऑब्जेक्ट या फ़ंक्शन को संदर्भित करता है।" –
यह अच्छा है। मुझे लगता है कि यह मेरे प्रश्न का बेहतर उत्तर देता है, क्योंकि यह कारण बताता है कि इसकी अनुमति क्यों नहीं है। मैं इसे अपने प्रश्न के उत्तर के रूप में स्वीकार कर रहा हूं। :-) – Nawaz