2016-10-03 8 views
7

साथ बनाम जीसीसी MSVC के व्यवहार निम्नलिखित कोड पर विचार करें:असंगत sizeof

#include <cstddef> 

class A 
{ 
public: 
    struct B 
    { 
     int M; 
    }; 

    static void StaticFunc(); 
}; 

void A::StaticFunc() 
{ 
    const std::size_t s0 = sizeof(::A::B::M); 
    const std::size_t s1 = sizeof(A::B::M); 
    const std::size_t s2 = sizeof(B::M); 
} 

int main() 
{ 
    const std::size_t s3 = sizeof(A::B::M); 
    return 0; 
} 

GCC compiles it, बस अप्रयुक्त चर के बारे में चेतावनी। लाइनों

const std::size_t s0 = sizeof(::A::B::M); 
const std::size_t s1 = sizeof(A::B::M); 

StaticFunc() में पर

error C2326: 'void A::StaticFunc(void)': function cannot access 'A::B::M' 

: तथापि

विजुअल C++ 2015 के साथ यह संकलन करने में विफल रहता है।

अन्य लाइन s2 = ..., और main() में संकलित ठीक है।

क्या यह एमएसवीसी में एक बग है, या क्या मुझे यहां कुछ बुनियादी याद आती है?

+0

मुझे कोई कारण नहीं दिखता कि इसे क्यों काम नहीं करना चाहिए। तो मैं कुछ हद तक आत्मविश्वास के साथ कहूंगा कि यह एक वीएस बग है। – bolov

+0

चूंकि ये कंपाइलर बनाम कंपाइलर प्रश्न यहां लोकप्रिय हैं, चलो पूल खोलें: – bolov

+6

ए) यह एक वीएस बग – bolov

उत्तर

5

यह एमएसवीसी में एक बग है।

सी ++ 11/14 एक गैर-स्थैतिक वर्ग सदस्य को गैर-मूल्यांकन संदर्भ में उपयोग करने की अनुमति देता है, देखें 5.1.1 [expr.prim.general] p। 13:

एक आईडी अभिव्यक्ति एक वर्ग के एक गैर स्थिर डेटा के किसी सदस्य या गैर स्थिर सदस्य समारोह अर्थ है कि केवल इस्तेमाल किया जा सकता:

...

(13,3) - अगर वह आईडी-अभिव्यक्ति एक गैर स्थैतिक डेटा सदस्य को दर्शाती है और यह एक अपरिचित ऑपरेंड में दिखाई देती है।

[उदाहरण:

struct S { 
     int m; 
    }; 
    int i = sizeof(S::m);  // OK 
    int j = sizeof(S::m + 42); // OK 

- अंत उदाहरण]

संपादित करें: ऐसा लगता है कि MSVC तरह B::M स्वीकार करता है और A::B::M है, जो एक पूरी तरह से भरी व्यवहार है स्वीकार नहीं करता। मैं नहीं देखता कि यह कैसे एक बग के अलावा कुछ भी हो सकता है।

सी ++ 11 और सी ++ 14 मोड में g ++ जैसे gang++ प्रोग्राम को स्वीकार करता है। C++ 03 मोड में clang ++ सभी 4 संदर्भों को M (सी ++ 03 में पी 13.3 की तरह कुछ भी नहीं है) को अस्वीकार करता है, जबकि सी ++ 03 मोड में g ++ अभी भी उन्हें स्वीकार करता है (यह शायद एक g ++ C++ 03 है मोड बग)।

संबंधित मुद्दे