I was somehow surprised that the following code compiles and runs (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;
}
Is it correct that this code compiles fine? And why is it correct? Why can I use auto on a private type, while I can't use its name (as expected)?
 
     
     
     
     
     
    