7

It recently came to my attention सदस्य सदस्य पूरी तरह से छाया कक्षा के अंदर एक ही नाम के साथ नि: शुल्क कार्य करता है। और पूरी तरह से मेरा मतलब है कि एक ही नाम के साथ हर मुफ्त समारोह को ओवरलोड रिज़ॉल्यूशन के लिए बिल्कुल नहीं माना जाता है। मैं समझ सकता क्यों यह इस तरह somwthing साथ किया जाता है:कक्षा सदस्य समान नाम के साथ छाया मुक्त फ़ंक्शंस क्यों काम करता है?

void f(); 

struct S 
{ 
    void f(); 

    void g() 
    { 
     f(); // calls S::f instead of ::f 
    } 
}; 

जहां कार्यों समान हस्ताक्षर है, चर scoping के रूप में अपनी ही प्राकृतिक उसी तरह काम करता है। लेकिन क्यों unambigious कॉल निषेध जहां मुक्त समारोह इस तरह अलग अलग हस्ताक्षर हैं:

void f(); 

struct S 
{ 
    void f(int x); 

    void g() 
    { 
     f(); // fails to compile attempting to call S::f, which has wrong signature 
    } 
}; 

मैं कैसे एक वर्ग अंदर से आच्छादित मुक्त समारोह कॉल करने के लिए नहीं कह रहा हूँ। मैं जो जानना चाहता हूं वह इस डिजाइन के पीछे तर्क है।

+1

आपको Bjarne Stroustrup से पूछने की आवश्यकता हो सकती है! – peacemaker

+1

इस तरह की खोज का मतलब है कि उत्पन्न उम्मीदवार कार्यों की सूची हमेशा छोटी होती है। संकलन के समय के लिए यह अच्छा है, आप कल्पना कर सकते हैं कि क्या उसने सभी संभावित उम्मीदवारों (एडीएल समेत) की खोज की है और वहां कई टेम्पलेट्स थे जो बहुत जल्दी धीमे हो जाएंगे। यह ज्यादातर मामलों में उपयोग और वांछित अर्थशास्त्र भी दर्पण करता है। आम तौर पर जब आप कहते हैं कि 'foo'' foo' जिसे आप सोच रहे हैं वह निकटतम है। यदि यह निकटतम नहीं है तो यह सिर्फ गलती की संभावना है। रन टाइम पर अजीब चीजें होने से एक त्रुटि बेहतर है। चीजों को स्थानीय रखना अच्छा व्यवहार है। – Flexo

+2

आप नाम प्रस्तुति पर इस प्रस्तुति का आनंद ले सकते हैं: http://channel9.msdn.com/Series/C9- व्याख्यान- स्टीफन- टी-लाववेज- कोर- सी-/स्टीफन- टी- लववेज- कोर- सी -1- -एन – MFH

उत्तर

6

अयोग्य नाम लुकअप के लिए, एक समय में केवल एक गुंजाइश माना जाता है, और यदि उस दायरे में खोज कोई परिणाम नहीं देती है, तो अगले उच्च दायरे की खोज की जाती है। आपके मामले में, केवल S के दायरे की खोज की जाती है।

लेकिन क्यों unambigious कॉल निषेध जहां मुक्त समारोह इस तरह अलग अलग हस्ताक्षर हैं:

समस्या यह है कि नाम देखने कुछ भी लेकिन नाम के साथ ही चिंता का विषय नहीं है, पहचानकर्ता है। यह इस तथ्य से पूरी तरह से अनजान है कि आप एक समारोह को कॉल करना चाहते हैं, यह सिर्फ एक पहचानकर्ता को देखता है। वही नाम लुकअप होता है यदि आप केवल auto x = f; का उपयोग करते हैं, और यदि आप इस तरह से सोचते हैं, तो बहुत अच्छे कारण हैं कि आप केवल खोज के लिए बहुत ही सीमित गुंजाइश चाहते हैं। कुछ और उपयोगकर्ता को आश्चर्यचकित करेगा।

+1

"_ समस्या यह है कि नाम लुकअप कुछ भी नहीं बल्कि नाम, पहचानकर्ता._" लगभग सभी भाषाओं में, यह सच है। सी ++ में नहीं। – curiousguy

2

मैं एक आधिकारिक उत्तर प्रदान नहीं कर सकता (शायद कुछ Design and Evolution of C++ से उद्धरण याद करते हैं या वास्तव में उस समय समिति पर रहे हैं), लेकिन मेरा पहला अनुमान आपके द्वारा दिखाए जाने वाले मामलों में बिल्कुल असफल होना होगा। यह भूलना आसान है कि एक निश्चित समय पर कितनी चीजें हैं। अतिरिक्त अधिभार संकल्प काफी जटिल हो सकता है और डिफ़ॉल्ट तर्क और रूपांतरण हो सकता है। इसलिए मुझे उस मामले में सबसे सीमित दायरा रखना होगा ताकि यह सुनिश्चित किया जा सके कि वास्तव में क्या कहा जा रहा है।

+0

अटकलें, लेकिन यह भी मेरा झुकाव है। पागल दूर flung खोजों और typos पर भरोसा करने के बीच अंतर करना मुश्किल है। – Flexo

+0

"_ यह भूलना आसान है कि एक निश्चित समय पर कितनी चीजें गुंजाइश हैं ._" यह छिपाने वाले नाम नहीं करने के लिए एक बेहद मजबूत तर्क है। – curiousguy

3

एक विशेष, बहुत ही आश्चर्य की, नियम (लेकिन यह अपने उदाहरण पर लागू नहीं होता) करते हुए कहा कि एक बार एक वर्ग के सदस्य नाम नाम देखने से पाया जाता है, कोई नाम स्थान स्कोप की खोज कर रहे हैं नहीं है:

#include <string> 

struct C { 
    std::string s; 

    explicit C (std::string); 

    void swap (C& rhs) { 
     swap (s, rhs.s); // error: swap is C::swap 
    } 
}; 

void swap (C& lhs, C& rhs) { 
    swap (lhs.s, rhs.s); // std::swap(string,string) 
} 

आईएमओ, यह पागलपन है।

लेकिन क्यों unambigious कॉल निषेध जहां मुक्त समारोह इस तरह अलग अलग हस्ताक्षर हैं:

नाम देखने ओवरलोडिंग संकल्प से पहले होता है:

  • तो देखने अस्पष्ट है, अधिक भार संकल्प नहीं किया जाता है।
  • यदि नाम लुकअप द्वारा कोई व्यवहार्य फ़ंक्शन नहीं मिलता है, तो लुकअप का कोई अन्य दौर प्रयास नहीं किया जाता है।

नियम पर्याप्त जटिल ओवरलोडिंग और नाम देखने के बीच "प्रतिक्रिया" के बिना कर रहे हैं। मैं सरलीकरण के बजाय सरलीकरण (सदस्य को नामस्थान स्कोप नाम नियम छुपाएं, और संदिग्ध नाम लुकअप को हटाकर) को हटाने का सुझाव दूंगा।

+0

यह उतना पागल नहीं है जितना आप सोच सकते हैं। नाम लुकअप बंद हो जाता है जब एक मैच मिल जाता है (कहीं भी §3.4 या उसके आसपास कहा जाता है), और अंदरूनी ओर से एक सटीक क्रम दिया जाता है। तो यदि किसी नाम वाला कोई सदस्य पाया जाता है, तो यह बंद हो जाता है। कोई आश्चर्य नहीं। – Damon

+0

@ डैमन "_नाम लुकअप बंद हो जाता है जब एक मैच मिल जाता है_" नहीं, क्योंकि मेरा दूसरा 'स्वैप' कॉल शो – curiousguy