हमारे कुख्यात litb के पास 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, जीसीसी 4.7.0 (user1131467 की टिप्पणी देखें) और बजना 3.0 और Comeau सी के साथ संकलित साथ/सी सी ++ 03 सख्त मोड में ++ 4.3.10.1 और MSVC 2005
मैं this answer जिसमें मैं इसका इस्तेमाल सही ठहराने के लिए कि यह वास्तव में कानूनी था पर Luchian द्वारा कहा गया था। मैं लुचियान से सहमत हूं कि यह अजीब है, हालांकि क्लेंग और कॉमऊ दोनों "मानक" कंपाइलर्स के लिए करीबी दावेदार हैं (डिफ़ॉल्ट रूप से एमएसवीसी से कहीं ज्यादा) ...
और मुझे ड्राफ्ट में कुछ भी नहीं मिला मेरे द्वारा उपलब्ध मानकों में से (n3337 अंतिम संस्करण है जिस पर मुझे अपना हाथ मिला है)।
तो ... क्या कोई वास्तव में यह मानता है कि यह कानूनी है या नहीं है?
एफवाईआई यह 'सब + आउटपुट: 42' 'जी ++ - 4.7 (डेबियन 4.7.0-1) 4.7.0' के साथ' -std = C++ 11' और '-std = gnu ++ 11' –
दोनों में आउटपुट करता है क्षमा करें, यह मेरा बुरा है। यह संकलित करता है, जो संकलित नहीं किया गया था http://stackoverflow.com/a/6886432/673730 - और मैं डेटा सदस्य नहीं, एक निजी फ़ंक्शन तक पहुंचने का प्रयास कर रहा था। –
बीटीडब्ल्यू मैं अभी भी इसका जवाब ढूंढ रहा हूं, अगर जवाब काम करता है, तो यह वही होगा जो मैं खोज रहा था, लेकिन ऐसा नहीं है। –