2015-02-07 9 views
7

एक प्रकार कक्षा मैं कच्चे भंडारण पर काम कर रहा हूँ में एक चार सरणी है संग्रहीत वस्तु प्राप्त करने के लिए:reinterpret_cast/static_cast और अपरिभाषित व्यवहार

template<class X> 
const X &get() 
{ 
    // ... 
    return *reinterpret_cast<X *>(storage); 
    // ... 
} 

ऐसा लगता है लेकिन यह हमेशा अच्छी तरह परिभाषित है? मैं पॉइंटर को सुरक्षित रूप से संदर्भित करने के बारे में चिंतित हूं (क्या यह टाइप एलियासिंग नियमों द्वारा अनुमत है?)।

https://stackoverflow.com/a/7321815/3235496 (देखें James Kanze की टिप्पणी):

वर्तमान कार्यान्वयन और

return *static_cast<const X *>(static_cast<const void *>(storage)); 

संबंधित प्रश्न/उत्तर के बीच कोई अंतर है। C++ When should we prefer to use a two chained static_cast over reinterpret_cast

+0

निश्चित रूप से यह 'नया (भंडारण) एक्स (एक्स);' एक स्मृति रिसाव –

+1

@EdHeal यह प्लेसमेंट नए के माध्यम से भंडारण में एक्स बनाता है। यह गठबंधन भंडारण के लिए एक सुरक्षित अभ्यास होना चाहिए (उदा। Http://stackoverflow.com/questions/4583125/char-array-as-storage-for-placement- new)। क्या आप कुछ विवरण जोड़ सकते हैं? – manlio

उत्तर

4

storage के रूप में सही ढंग से गठबंधन है, मैं कल्पना नहीं कर सकते हैं, जहां एक समस्या पैदा कर सकता:


संपादित

दूसरा सवाल पहले से ही एक जवाब यहाँ है। पॉइंटर रूपांतरणों पर अनुच्छेद (*) 4.10 कहता है: टी "सूचक से सीवी टी" का एक प्रकार, जहां टी एक ऑब्जेक्ट प्रकार है, को "पॉइंटर से सीवी शून्य" के रूप में परिवर्तित किया जा सकता है। ऑब्जेक्ट टाइप करने के लिए पॉइंटर के गैर-शून्य पॉइंटर मान को "पॉइंटर टू सीवी शून्य" में परिवर्तित करने का परिणाम स्मृति में उसी बाइट के पते को मूल सूचक मूल्य के रूप में दर्शाता है।

अपने दूसरे प्रश्न, पैरा 5.2.10 reinterpres_cast पर के संबंध में: एक वस्तु सूचक स्पष्ट रूप से एक अलग प्रकार का एक उद्देश्य सूचक के लिए परिवर्तित किया जा सकता है। जब ऑब्जेक्ट पॉइंटर प्रकार का एक प्रावधान v ऑब्जेक्ट पॉइंटर प्रकार "पॉइंटर टू सीवी टी" में परिवर्तित होता है, तो परिणाम static_cast<cv T*>(static_cast<cv void*>(v)) है जहां cv वैकल्पिक const या volatile के लिए खड़ा है।

तो इस भाग की प्रति चश्मा की गारंटी है। अधिक के रूप में हमने देखा कि void * करने के लिए एक डाली स्मृति की पहली बाइट इंगित करना चाहिए, वहाँ मानक ... प्रदान की compilers की मेरी समझ के लिए कोई यूबी है एक ही समझ ;-)

(*) संदर्भ है: Draft for current C++ specification

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