2015-12-15 8 views
9

समस्या यह है कि विभिन्न कंपाइलर अलग आउटपुट (क्लैंग/जीसीसी) उत्पन्न करता है और इसलिए मुझे लगता है कि यह उपयोग अपरिभाषित व्यवहार है। हालांकि मेरा लक्ष्य संदर्भ निर्दिष्ट करते समय const को कम करना है।ऑपरेटर टी से डीडिंग कॉन्स()

साथ आउटपुट:
बजना-3.6 ->not const
जीसीसी-4.8.4 ->const

#include <iostream> 
#include <type_traits> 

struct AnyReference { 

    template <typename RT> AnyReference(RT &a_var) : _ptr(&a_var) {} 

    template <typename T> operator T &() const 
    { 
     if (std::is_const<T>::value) { 
      std::cout << "const\n"; 
     } 
     else { 
      std::cout << "not const\n"; 
     } 
     return *reinterpret_cast<T *>(_ptr); 
    } 
    void *_ptr; 
}; 

int main() 
{ 
    int i(5); 
    AnyReference a(i); 
    const int &c = a; 
} 
+0

मैं तुम्हें पढ़ने देती हैं यह निम्नलिखित पोस्ट: http://stackoverflow.com/questions/32515183/const-auto-stdinitializer-list-difference-between-clang-and-gcc –

+3

क्या आपने दोनों ओपेरा प्रदान करने पर विचार किया है टोर टी एंड 'और 'ऑपरेटर कॉन्स टी एंड'? –

+0

@ बेन वोगेट नहीं मैंने नहीं किया है, लेकिन यह बहुत अच्छा समाधान है! यह उम्मीद के रूप में काम करता है। –

उत्तर

2

एक संभावना यह बेन वाइट के विचार पर आधारित

struct AnyReference { 

    template <typename RT> AnyReference(RT &a_var) : _ptr(&a_var) {} 

    template <typename T> operator T &() const { return operatorTand<T>(); } 

    template <typename T> operator const T &() const 
    { 
     return operatorTand<const T>(); 
    } 

    private: 
    template <typename T> T &operatorTand() const 
    { 
     if (std::is_const<T>::value) { 
      std::cout << "const\n"; 
     } 
     else { 
      std::cout << "not const\n"; 
     } 
     return *reinterpret_cast<T *>(_ptr); 
    } 

    void *_ptr; 
}; 
संबंधित मुद्दे