class io_service : private noncopyable
{
private:
// что-то
public:
    class work;
     friend class work;
     class id;
     class service;
     class strand;
    // что-то
};
Я заметила, что класс work является вложенным(nested) и одновременно является другом класса io_service. Вспомнив, что в C++ вложенный класс ничем не отличается от обычного класса, кроме того, что он ограничен областью видимости включающего(enclosing) класса, я решила-таки поставить небольшой эксперимент.
#include
using namespace std;
class A
{
     A(int a, int b) : _a(a), _b(b) {}
     int _a, _b;
public:
     class B
     {
     public:
         void foo()
         {
             A obj_A(12, 21);
             cout << obj_A._a << "\t" << obj_A._b << endl;
         }
     };
};
int main()
{
     A::B obj_B;
     obj_B.foo();
     cin.get();
     return 0;
}
Этот hello_world без каких-либо предупреждений о неповиновении стандарту компилируется в Visual Studio 2005 и работает(правильно:)). Но так лучше не делать.
Что говорит стандарт по этому поводу?
The members of a nested class have no special access to members of an enclosing class, nor to classes or functions that have granted friendship to an enclosing class; the usual access rules (clause 11) shall be obeyed. The members of an enclosing class have no special access to member of a nested class; the usual access rules(clause 11) shall be obeyed.
И далее следует пример:
class E
{
     int x;
     class B { };
     class I
     {
         B b; // error: E::B is private
         int y;
         void f(E* p, int i)
         {
             p->x = i; // error: E::x is private
         }
     };
     int g(I* p)
     {
         return p->y; // error: I::y is private
     }
};
В итоге получается, что вижак-таки отклонился от стандарта... Однако, вторую часть о доступе к приватным данным внутри вложенного класса из включающего класса он соблюдает, и код, подобный тому, что приведен ниже не скомпилируется.
class A
{
     class B
     {
         B(int c, int d) : _c(c), _d(d) {}
         int _c, _d;
     };
public:
     void foo()
     {
         B obj_B(13, 31);
         cout << obj_B._c << "\t" << obj_B._d << endl;
     }
};
int main()
{
     A obj_A;
     obj_A.foo();
     cin.get();
     return 0;
}