2014-12-05 4 views
6

§13.3.1/4 (N3337) में आप निम्न दिखाई देगें:स्थिर सदस्य कार्यों को §13.3.1/4 के अनुसार एक अंतर्निहित ऑब्जेक्ट पैरामीटर क्यों होना चाहिए?

स्थिर सदस्य कार्यों के लिए, अंतर्निहित वस्तु पैरामीटर किसी भी वस्तु से मेल है (चूंकि यदि समारोह का चयन किया गया माना जाता है, ऑब्जेक्ट को त्याग दिया गया है)।

एक स्थिर सदस्य समारोह एक इस सूचक नहीं है:

§9.4.1/2 इस दावे को नहीं है।

फिर, स्थिर सदस्य फ़ंक्शन के लिए निहित ऑब्जेक्ट पैरामीटर का उद्देश्य क्या है?

उत्तर

0

नीचे मानक से वर्णन है जो दर्शाता है कि निहित ऑब्जेक्ट पैरामीटर का उपयोग ओवरलोडिंग उद्देश्य के लिए किया जाता है।

ओवरलोड रिज़ॉल्यूशन शुरू होने से पहले, नाम लुकअप और टेम्पलेट तर्क कटौती द्वारा चुने गए कार्यों को उम्मीदवार कार्यों के सेट के रूप में जोड़ा जाता है (सटीक मानदंड उस संदर्भ पर निर्भर करता है जिसमें ओवरलोड रिज़ॉल्यूशन होता है)।

यदि कोई उम्मीदवार फ़ंक्शन एक सदस्य फ़ंक्शन (स्थैतिक या गैर स्थैतिक) है, लेकिन कोई कन्स्ट्रक्टर नहीं है, तो ऐसा माना जाता है कि इसमें एक अतिरिक्त पैरामीटर (निहित ऑब्जेक्ट पैरामीटर) है जो उस ऑब्जेक्ट का प्रतिनिधित्व करता है जिसके लिए उन्हें बुलाया जाता है और वास्तविक मानकों के पहले से पहले प्रकट होता है।

इसी तरह, वस्तु, जिस पर एक सदस्य समारोह बुलाया जा रहा है, निहित वस्तु तर्क

दसवीं कक्षा के सदस्य के रूप में कार्य करता है के लिए तर्क सूची के लिए prepended है, अंतर्निहित वस्तु पैरामीटर के प्रकार सीवी से प्रभावित होता है - सदस्य समारोह की योग्यता और पुन: योग्यता।

स्थिर सदस्य कार्यों के लिए, अंतर्निहित ऑब्जेक्ट पैरामीटर किसी ऑब्जेक्ट से मेल खाने के लिए माना जाता है: इसके प्रकार की जांच नहीं की जाती है और के लिए कोई रूपांतरण अनुक्रम का प्रयास नहीं किया जाता है।

3

इसका उपयोग ओवरलोड रिज़ॉल्यूशन को समझने में आसान बनाने के लिए किया जाता है।

struct S { 
    void f(int); 
    static void f(double); 
}; 

int main() { 
    S::f(1); 
} 

यहाँ, s::f(1); बस एक कठिन त्रुटि है, क्योंकि f(int)f(double) तुलना में एक बेहतर मुकाबला नहीं है, भले ही f(int) अधिभार आगे पर एक कठिन त्रुटि का कारण बनता है।

तो नियम किसी अन्य तरीके से कर रहे थे, पर विचार क्या इस के लिए क्या होगा:

template <typename T> 
struct U : S { 
    void u() { 
    S::f(1); 
    } 
}; 

template <typename T> 
struct V : U<T> { 
    void v() { 
    S::f(1); 
    } 
}; 

यहाँ, U::u स्पष्ट रूप से वैध है और सदस्य समारोह कहता है। V<T>, हालांकि, एक प्रकार-निर्भर बेस क्लास है, इसलिए S से प्राप्त करने के लिए टेम्पलेट परिभाषा समय पर ज्ञात नहीं है। S::ff(double) ओवरलोड को हल करने से बहुत भ्रमित हो जाएगा।

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