Может ли указатель на участников обойти уровень доступа участника?

Наш печально известный Литб имеет интересную статью окак обойти проверку доступа.

Это полностью демонстрируется этим простым кодом:

#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;
}

Который компилируется и запускается (вывод42) с участиемgcc 4.3.4, gcc 4.5.1, gcc 4.7.0 (см. комментарий user1131467) и компилируется с Clang 3.0 и Comeau C / C ++ 4.3.10.1 вC ++ 03 строгий режим и MSVC 2005.

Лучиан спросил меняэтот ответ в котором я использовал это, чтобы оправдать, что это было фактически законно. Я согласен с Лучианом в том, что это странно, однако и Clang, и Comeau являются близкими претендентами на большинство доступных «стандартных» компиляторов (гораздо больше, чем MSVC по умолчанию) ...

И я не смог найти ничего в черновиках Стандартов, которые у меня есть (n3337 - последняя версия, в которую я попал).

Так что ... может кто-нибудь на самом деле оправдывает этозаконно или нет ?

Ответы на вопрос(2)

Ваш ответ на вопрос