2010-02-25 14 views
10

boost::detail::addressof_impl::f()reinterpret_cast रों की एक श्रृंखला में मामला class T में वस्तु के वास्तविक पते प्राप्त करने के लिए operator&() अतिभारित है किया जाता है:चार अस्थिर और आवश्यक क्यों और कब डाला जाता है?

template<class T> struct addressof_impl 
{ 
    static inline T* f(T& v, long) 
    { 
     return reinterpret_cast<T*>(
      &const_cast<char&>(reinterpret_cast<const volatile char&>(v))); 
    } 
} 

const volatile char& के बजाय सिर्फ char& पर कास्ट करने के लिए कलाकारों का उद्देश्य क्या है?

उत्तर

8

एक char& के लिए सीधे डाली यदि Tconst या volatile क्वालिफायर है विफल हो जाएगा - reinterpret_cast इन को दूर कर सकते (लेकिन उन्हें जोड़ सकते हैं), और const_cast मनमाना प्रकार परिवर्तन नहीं कर सकते।

4

वस्तु const या volatile, या दोनों, जो मामले में यह शायद यह reinterpret_cast करने के लिए अवैध एक प्रकार है कि इन विशेषताओं का अभाव है (oxymoronic कि हो सकता है के रूप में के रूप में) हो सकता है। (विपरीत दिशा में जा रहा है निश्चित रूप से कोई समस्या नहीं है)।

+8

यह 'कॉन्स' और 'अस्थिर' दोनों होने के लिए ऑक्सीमोरोनिक नहीं है। उदाहरण के लिए, केवल पढ़ने योग्य हार्डवेयर रजिस्टर जो प्रत्येक बार पढ़े जाने पर एक अलग मूल्य देता है, या किसी अन्य प्रक्रिया द्वारा अपडेट की गई साझा मेमोरी में केवल-पढ़ने वाली वस्तु, दोनों क्वालीफायर होना चाहिए। –

+1

यूप। कॉन्स का वह पहलू वास्तव में अस्थिर के साथ संगठित है। – Ari

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