Unser berüchtigter litb hat einen interessanten Artikel über how to circumvent the access check.Mai Zeiger auf Mitglieder umgehen die Zugriffsebene eines Mitglieds?
Es ist voll von diesem einfachen Code demonstriert:
#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;
}
Welche und läuft (Ausgang 42
) kompiliert mit gcc 4.3.4, gcc 4.5.1, gcc 4.7.0 und kompiliert mit Clang 3.0 und Comeau C (user1131467 Kommentar sehen)/C++ 4.3.10.1 in C++ 03 Strict-Modus und MSVC 2005
ich von Luchian auf this answer, in dem ich sie gefragt wurde verwendet, um zu rechtfertigen, dass es tatsächlich legal war. Ich stimme Luchian zu, dass es komisch ist, aber sowohl Clang als auch Comeau sind enge Konkurrenten für die meisten "Standard" -Compiler (viel mehr als MSVC standardmäßig) ...
Und ich konnte nichts in den Entwürfen finden von den Standards, die ich zur Verfügung habe (n3337 ist die letzte Version, die ich in die Finger bekam).
Also ... kann jemand tatsächlich rechtfertigen, dass es legal ist oder nicht?
FYI Dies gibt 'proof: 42' mit' g ++ - 4.7 (Debian 4.7.0-1) 4.7.0' sowohl in -std = C++ 11' als auch in -std = gnu ++ 11' –
aus Entschuldigung, das ist mein Fehler. Das kompiliert, was nicht kompiliert wurde, war http://stackoverflow.com/a/6886432/673730 - und ich versuchte, auf eine private Funktion zuzugreifen, nicht Datenmitglied. –
BTW Ich bin immer noch auf der Suche nach einer Antwort darauf, wenn die Antwort funktioniert, wäre es genau das, wonach ich gesucht habe, aber es tut es nicht. –