मुझे किसी तरह आश्चर्य हुआ कि निम्नलिखित कोड संकलित करता है और चलता है (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()
आपके द्वारा दिए गए प्रकार को "देख" सकता है यदि आप इसे पकड़ सकते हैं, तो आप इसे नाम नहीं दे सकते।