Le classi interne in C ++ sono automaticamente amici?

Se definisco una class interna in C ++, è automaticamente un amico della class che lo contiene? Ad esempio, questo è legale:

class Outer { public: class Inner { public: void mutateOuter(Outer& o); }; private: int value; }; void Outer::Inner::mutateOuter(Outer& o) { o.value ++; // Legal? Or not? } 

Chiedo perché su alcuni compilatori che ho provato (VS2003) questo codice non funziona, ma ho sentito almeno aneddoticamente che funziona su alcuni compilatori. Non riesco a trovare una sezione pertinente nelle specifiche C ++ su questo, e se qualcuno può citare qualcosa di specifico che direbbe che è o non è legale sarebbe grandioso.