मुझे किसी तरह आश्चर्य हुआ कि निम्नलिखित कोड संकलित करता है और चलता है (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एक निजी प्रकार का उपयोग क्यों कर सकता हूं , जबकि मैं इसके नाम का उपयोग नहीं कर सकता (उम्मीद के मुताबिक)?
privateएपीआई का वर्णन करने के लिए एक सुविधा के रूप में है कि कंपाइलर लागू करने में मदद कर सकता है। इसका उद्देश्य Barउपयोगकर्ताओं द्वारा प्रकार तक पहुंच को रोकना नहीं है Foo, इसलिए यह Fooकिसी भी तरह से उस उदाहरण की वापसी से किसी भी तरह से बाधा नहीं डालता है Bar।
#include <iostream>। ;-)
f.Baz().iजैसा भी है ठीक हैstd::cout << typeid(f.Baz()).name()। कक्षा के बाहर का कोडBaz()आपके द्वारा दिए गए प्रकार को "देख" सकता है यदि आप इसे पकड़ सकते हैं, तो आप इसे नाम नहीं दे सकते।