Мене якось здивувало, що наступний код збирається та працює (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()
якщо ви можете отримати його, ви просто не можете його назвати.