2011-12-20 14 views
8

मुझे यकीन है कि निम्नलिखित कोड संकलित नहीं होना चाहिए। लेकिन, जी ++ में, यह संकलित करता है! इसे http://codepad.org/MR7Dsvlz पर संकलित देखें।अमान्य सी ++ से (पॉइंटर से कॉन्स्ट) (पॉइंटर से गैर-कॉन्स) तक कास्ट है?

कोड:

#include <iostream> 

using namespace std; 

int main() { 
    int x = 32 ; 
    // note: if x is, instead, a const int, the code still compiles, 
    // but the output is "32". 

    const int * ptr1 = & x ; 

    *((int *)ptr1) = 64 ; // questionable cast 
    cout << x ;   // result: "64" 
} 

त्रुटि में जी ++ इस संकलन के द्वारा है?

+0

यदि आप स्थिरता को दूर करना चाहते हैं (और आपको यकीन है कि इसकी अनुमति है) idiomatic C++ तरीका यह करने के लिए 'const_cast (ptr1)' है - हालांकि सी कास्ट भी काम करेगा, जैसा कि आपने अभी देखा है । –

+1

यह पढ़ने में मददगार है: http://stackoverflow.com/questions/357600/is-const-cast-safe – Pubby

उत्तर

9

नंबर सी ++ मानक का §5.4.4 के अनुसार, डाले कि एक सी शैली कलाकारों द्वारा प्रदर्शन किया जा सकता हैं:

— a const_cast (5.2.11), 
— a static_cast (5.2.9), 
— a static_cast followed by a const_cast, 
— a reinterpret_cast (5.2.10), or 
— a reinterpret_cast followed by a const_cast 

यह व्यापक तौर पर "दूर कास्टिंग const -नेस" में जाना जाता है , और यदि संकलक उस कोड को संकलित नहीं करता है तो संकलक मानक के उस हिस्से के अनुरूप नहीं होगा।

जैसा कि ildjarn बताता है, const ऑब्जेक्ट को const नेस को कास्टिंग के माध्यम से संशोधित करना अपरिभाषित व्यवहार है। यह प्रोग्राम अपरिभाषित व्यवहार प्रदर्शित नहीं करता है, हालांकि एक ऑब्जेक्ट जिसे पॉइंटर-टू -const द्वारा इंगित किया गया था, ऑब्जेक्ट स्वयं const नहीं है (धन्यवाद मेरी मास्ट रीडिंग को सुधारने के लिए आर। मार्टिन्हो और ईहेस्टवेस्ट)।

+0

"नहीं" - तो जी ++ कोड संकलित किया जाना चाहिए था? "संकलक मानक के उस हिस्से के अनुरूप नहीं होगा अगर वह उस कोड को संकलित नहीं करता है।" - तो जी ++ मानक के उस हिस्से के अनुरूप है? –

+0

@ नोसेनिम आपका प्रश्न था "क्या यह संकलन करके त्रुटि में g ++ है?" जिस पर मैंने जवाब दिया "नहीं"। तो जी ++ को कोड संकलित करना चाहिए, और करता है, और यह मानक के उस हिस्से के अनुरूप है। –

+3

नोसेनिम, आपने विरोधाभासी प्रश्न पूछा। किसी भी * हां * आपके शीर्षक प्रश्न का उत्तर शरीर प्रश्न के लिए * नहीं * जवाब था। कृपया अगली बार अधिक सावधान रहें। –

3

नहीं जी ++ आपके कोड को संकलित करके त्रुटि में नहीं है। आपके द्वारा किया गया कलाकार मान्य है।

(int *)ptr1 एक सी कास्ट है। सी ++ में समतुल्य const_cast<int*>(ptr1) है। दूसरी शैली पढ़ने के लिए स्पष्ट है।

लेकिन, इस कलाकार को करने की आवश्यकता (एक कॉन्स वैरिएबल को संशोधित करने के लिए) डिज़ाइन में एक समस्या दिखाती है।

1

लाइन *((int *)ptr1) = 64const_cast पहले डाली है कि जब आप डाली संकेतन का उपयोग किया जाता है है *(const_cast<int*>(ptr1)) = 64 के बराबर है।