¿Puede un puntero a los miembros evadir el nivel de acceso de un miembro?

Nuestro infame litb tiene un interesante artículo sobre Cómo evitar el control de acceso.

Está completamente demostrado por este simple código:

#include <iostream>

template<typename Tag, typename Tag::type M>
struct Rob { 
  friend typename Tag::type get(Tag) {
    return M;
  }
};

// use
struct A {
  A(int a):a(a) { }
private:
  int a;
};

// tag used to access A::a
struct A_f { 
  typedef int A::*type;
  friend type get(A_f);
};

template struct Rob<A_f, &A::a>;

int main() {
  A a(42);
  std::cout << "proof: " << a.*get(A_f()) << std::endl;
}

Que compila y ejecuta (salida42) congcc 4.3.4, gcc 4.5.1, gcc 4.7.0 (ver el comentario del usuario 1131467) y compila con Clang 3.0 y Comeau C / C ++ 4.3.10.1 en C ++ 03 modo estricto y MSVC 2005.

uchian me preguntó enesta respuesta en el que lo usé para justificar que en realidad era legal. Estoy de acuerdo con Luchian en que es extraño, sin embargo, Clang y Comeau son competidores cercanos para la mayoría de los compiladores "estándar" disponibles (mucho más que MSVC por defecto) ...

Y no pude encontrar nada en los borradores de las Normas que tengo disponibles (n3337 es la última versión que tengo en mis manos).

Entonces ... ¿alguien puede realmente justificar que eslegal o no ?

Respuestas a la pregunta(4)

Su respuesta a la pregunta