मैं किसी भी तरह हैरान हूँ कि निम्नलिखित कोड को संकलित करता है और रन (vc2012 & gcc4.7.2)मैं निजी प्रकार पर ऑटो का उपयोग क्यों कर सकता हूं?
class Foo {
struct Bar { int i; };
public:
Bar Baz() { return Bar(); }
};
int main() {
Foo f;
// Foo::Bar b = f.Baz(); // error
auto b = f.Baz(); // ok
std::cout << b.i;
}
यह है कि इस कोड ठीक संकलित सही है था? और यह सही क्यों है? मैं निजी प्रकार पर auto
का उपयोग क्यों कर सकता हूं, जबकि मैं इसका नाम (अपेक्षित के रूप में) का उपयोग नहीं कर सकता?
गौर करें कि 'f.Baz() मैं' घ भी ठीक है के रूप में 'एसटीडी है :: cout << टाइपिड (एफ। बैज़())। नाम() '। कक्षा के बाहर कोड 'बाज़()' द्वारा लौटाए गए प्रकार को "देख" सकता है यदि आप इसे पकड़ सकते हैं, तो आप इसे नाम नहीं दे सकते। –
और यदि आपको लगता है कि यह अजीब है (जो आप शायद करते हैं, जैसा कि आप इसके बारे में पूछ रहे हैं) आप अकेले नहीं हैं;) यह रणनीति [सुरक्षित-बूल मुहावरे] जैसी चीजों के लिए शक्तिशाली है (http: // www .artima.com/cppsource/safebool.html) हालांकि। –
मुझे लगता है कि याद रखने की बात यह है कि 'निजी' एपीआई का वर्णन करने के लिए एक सुविधा के रूप में है कि संकलक लागू करने में मदद कर सकता है। इसका उद्देश्य 'फू' के उपयोगकर्ताओं द्वारा 'बार' प्रकार तक पहुंच को रोकने का इरादा नहीं है, इसलिए यह 'बार' के उदाहरण को वापस कर उस पहुंच की पेशकश से किसी भी तरह से 'Foo' को बाधित नहीं करता है। –