Меня как-то удивило, что следующий код компилируется и запускается (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
частный тип, в то время как я не могу использовать его имя (как и ожидалось)?
f.Baz().i
это тоже нормально, как естьstd::cout << typeid(f.Baz()).name()
. Код за пределами класса может «видеть» тип, возвращаемый,Baz()
если вы можете получить его, вы просто не можете назвать его.