Мене якось здивувало, що наступний код збирається та працює (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є зручність для опису API таким чином, що компілятор може допомогти виконувати їх. Він не призначений для запобігання доступу до цього типу Barкористувачами Foo, тому він жодним чином не перешкоджає Fooпропонувати цей доступ шляхом повернення екземпляра Bar.
#include <iostream>. ;-)
f.Baz().iце також добре, як єstd::cout << typeid(f.Baz()).name(). Код поза класом може "бачити" тип, що повертається,Baz()якщо ви можете отримати його, ви просто не можете його назвати.