У нашей печально известной газеты есть интересная статья о , как обойти проверку доступа .
Это полностью демонстрируется этим простым кодом:
#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 (см. Комментарий пользователя 1131467) и компилируется с Clang 3.0 и Comeau C / C ++ 4.3.10.1 в строгом режиме C ++ 03 и MSVC 2005.
Лучиан спросил меня об этом этом ответе , в котором я использовал его, чтобы обосновать, что это действительно законно. Я согласен с Лучианом в том, что это странно, однако и Clang, и Comeau являются близкими претендентами на большинство доступных «стандартных» компиляторов (намного больше, чем MSVC по умолчанию) ...
И я не смог найти ничего в черновиках Стандартов, которые у меня есть (n3337 - последняя версия, в которую я попал).
Итак ... может ли кто-нибудь на самом деле оправдать, что это законно или нет ?