Я читаю этот вопрос о переполнении Stack , и я добавил конструктор кода из этого вопроса в качестве аргумента,
class Foo {
struct Bar {
int i;
Bar(int a = 5) :i(a) {};
};
public:
Bar Baz() { return Bar(); }
};
int main() {
Foo f;
// Foo::Bar b = f.Baz(); // error
auto b = f.Baz(); // ok
std::cout <<"b.i="<< b.i<<endl;
return 0;
}
Вывод кода b.i=5
. В этом вопросе он заключает, что имя частного доступа недоступно, но тип есть. Итак, какая разница между типом и именем, в общем?
И скажу, что у меня есть два конкретных сценария.
-
Какая разница между следующими двумя объявлениями? Почему я могу получить вывод
b.i=5
изauto b = f.Baz();
?Foo::Bar b = f.Baz(); auto b = f.Baz();
-
Если я добавлю
typedef Bar B;
в общедоступную частьFoo
, в чем разница между следующими?Foo::Bar b = f.Baz(); Foo::B b = f.Baz();
Если существует разница между сценариями 1 и 2?