On unwanted access to inner classes in C++11

#include <iostream>
#include <typeinfo>

class Outer {
private:
	class Inner {
	public:
		void Do() {
			std::cout<<"Do"<<std::endl;
		}
	};
private:
	Inner inner;
public:
	Inner& Get() {
		return inner;
	}
};

int main()
{
	Outer O;
	// err: private Outer::Inner
    // Outer::Inner& x=O.Get(); x.Do();
    auto& x=O.Get();
    x.Do(); // ok
    std::cout << typeid(x).name() << std::endl;  
    O.Get().Do(); // ok
    return 0;
}