2014-07-06 15 views
18

मैं विजुअल स्टूडियो 2012 का उपयोग कर रहा हूं, और मुझे ऐसा कुछ मिला है जो अजीब तरह का है। मैं ऐसा कुछ नहीं लिख रहा हूं जिसके लिए मुझे कई कंपाइलरों में संगत होने की आवश्यकता है, लेकिन बाद में यह हो सकता है (जब कोड वेब पर रखा जाता है, तो उपयोगकर्ता संकलक त्रुटियां नहीं प्राप्त करना चाहते हैं), लेकिन मैं लिखना नहीं चाहता कुछ गलत है, या सिर्फ मूल नहीं है। जबकि दूसरी पंक्ति सामान्य रूप से संकलित"ऑटो" टाइप कटौती संकलन जबकि स्पष्ट प्रकार त्रुटि देता है

class A{ 
    class B{ 
     public: 
     int i; 
    }; 
    B myB; 
public: 
    B& getB() { return myB; } 
}; 

int main() 
{ 
    A a; 
    A::B& b = a.getB(); 
    auto& b2 = a.getB(); 
} 

पहली पंक्ति के अंदर मुख्य पॉप्स error C2248: 'A::B' : cannot access private class declared in class 'A':

तो यह परीक्षण कोड है। मुझे आश्चर्य है, क्या ऑटो इस तरह काम करना चाहिए या विजुअल स्टूडियो में यह एक और बग है?

मैं किसी अन्य संकलक की जरूरत नहीं है मैं इसे

साथ पर परीक्षण कर सकते हैं तुम भी std::cout << b2.i << "\n"; की तरह सामान लिख सकते हैं और यह बिल्कुल ठीक संकलित

के अनुसार πάντα ῥεῖ की टिप्पणी, मैं ideone जीसीसी 4.8 के साथ करने की कोशिश की .1 और यह उसी तरह संकलित करता है, पहली पंक्ति त्रुटि है, दूसरी पंक्ति पूरी तरह ठीक है।

+4

_'PS: मेरे पास कोई अन्य कंपाइलर नहीं है जिसका मैं इसे परीक्षण कर सकता हूं'_: http://isocpp.org/blog/2013/01/online-c-compilers विशेष रूप से http://rise4fun.com/ वीसीपीपी –

+1

दिलचस्प। मैंने इस तरह की किसी चीज़ की वैधता कभी नहीं मानी थी, लेकिन ऐसा लगता है कि यह जीसीसी और क्लैंग के साथ भी संकलित है। –

+0

'बी' और 'बी 2' शुरू करने के लिए 'मुख्य' में कोड के साथ, आउटपुट कथन [* अपरिभाषित व्यवहार *] (http://en.wikipedia.org/wiki/Undefined_behavior) को' बी' और ' बी 2' उन वस्तुओं के संदर्भ हैं जिन्हें –

उत्तर

10

मुझे विश्वास है कि यह इस तरह काम करना चाहिए। एक्सेस नामों पर लागू होती है, न कि उन संस्थाओं को जिन्हें वे संदर्भित करते हैं।

auto के बिना भी यह हमेशा कानूनी रहा है getB के परिणाम को B की अपेक्षा रखने वाले फ़ंक्शन पर पास करें।

+1

इसके अलावा, यदि आप एक निजी वर्ग का सार्वजनिक 'टाइपपीफ' बनाते हैं, तो 'टाइप किए गए' नाम का उपयोग करके निजी वर्ग नाम का उपयोग करते समय कोई त्रुटि नहीं होती है। – Frxstrem

+3

या टाइपिफ़: http: //stackoverflow.com/questions/13532784/why-can-i-use-auto-on-a-private-type – kobigurk

+0

फिर "एक्सेस नामों पर लागू होती है, न कि उन संस्थाओं को जिन्हें वे संदर्भित करते हैं" *की तरह*। उदाहरण के लिए, सी +11 §12.1/1 "रचनाकारों के पास नाम नहीं हैं"। तर्कसंगत रूप से विनाशकों के पास नाम नहीं होते हैं, और वास्तव में सी ++ 11 में कम से कम एक (गैर-मानक) नोट होता है जो उस तरीके से तर्क देता है। –

3

auto उस तरह काम करना चाहिए, हां, और हां इसका मतलब है कि यह निजी प्रकारों का पर्दाफाश कर सकता है।

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