В нашей печально известной лампочке есть интересная статья о how to circumvent the access check.Может ли указатель на участников обходить уровень доступа члена?
Это полностью подтверждается этим простым кодом:
#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 и C Comeau/C++ 4.3.10.1 в C++ 03 строгого режима и MSVC 2005.
спросил меня Luchian на this answer, в котором я использовал его, чтобы оправдать, что это было на самом деле законно. Я согласен с Лучианом в том, что это странно, но как Clang, так и Comeau являются близкими соперниками для большинства доступных «стандартных» компиляторов (гораздо больше, чем MSVC по умолчанию) ...
И я ничего не мог найти в черновиках Стандартов, которые я имею в наличии (n3337 - последняя версия, в которой я получил свои руки).
Итак ... может ли кто-либо на самом деле оправдывать то, что это законно или нет?
FYI Это выводит 'proof: 42' с' g ++ - 4.7 (Debian 4.7.0-1) 4.7.0' в обоих '-std = C++ 11' и' -std = gnu ++ 11' –
Извините, это мое плохое. Это компилируется, то, что не компилировалось, было http://stackoverflow.com/a/6886432/673730 - и я пытался получить доступ к частной функции, а не к элементу данных. –
Btw Я все еще ищу ответ на этот вопрос, если бы ответ сработал, это было именно то, что я искал, но это не так. –