2013-02-28 11 views
8

निम्नलिखित कोड को वीसी ++ नवंबर 2012 सीटीपी के साथ संकलित किया गया था। लेकिन संकलक ने एक चेतावनी दी।क्यों decltype (* यह) सही प्रकार वापस नहीं करता है?

मुझे आश्चर्य है कि यह वीसी ++ नवंबर 2012 सीटीपी का एक बग है या नहीं।

struct A 
{ 
    int n; 

    A(int n) 
     : n(n) 
    {} 

    int Get() const 
    { 
     return n; 
    } 

    int Get() 
    { 
     // 
     // If using "static_cast<const A&>(*this).Get();" instead, then OK. 
     // 
     return static_cast<const decltype(*this)&>(*this).Get(); // Warning! 
    } 
}; 

int main() 
{ 
    A a(8); 

    // 
    // warning C4717: 'A::Get' : recursive on all control paths, 
    // function will cause runtime stack overflow 
    // 
    a.Get(); 
} 
+0

जब तक आप निरंतर 'गेट' में केवल एक मान वापस करने के बजाय वास्तव में अधिक नहीं करते हैं, तो आप केवल गैर-स्थिर 'Get' फ़ंक्शन में ऐसा ही कर सकते हैं। मुझे वास्तव में गैर-कॉन्स 'गेट' के लिए कोई कारण नहीं दिख रहा है। –

+5

उदाहरण कोड केवल अवधारणा के सबूत के लिए है। गेट() का वास्तविक कार्य यहां व्यर्थ है। – xmllmx

+0

पहले से ही 'ए' कॉन्स नहीं है? गैर-कॉन्स 'गेट' फ़ंक्शन के बारे में भी चेतावनी क्यों दी जाएगी? – Shahbaz

उत्तर

17

decltype एक अभिव्यक्ति है कि एक आईडी अभिव्यक्ति आप एक संदर्भ देता है नहीं है के लिए आवेदन किया है, तो पहले से ही decltype(*this)A& है, और आप उस const फिर से नहीं कर सकते। क्या तुम सच में decltype उपयोग करना चाहता था, तो आप कुछ इस तरह कर सकता है:

static_cast<std::decay<decltype(*this)>::type const &>(*this) 

या यहां तक ​​कि इस:

static_cast<std::add_lvalue_reference< 
       std::add_const< 
         std::decay<decltype(*this)>::type 
       >::type 
      >::type 
>(*this) 

बेशक यह बहुत सरल सिर्फ static_cast<A const &>(*this) कहने के लिए है।

+0

तो, निष्कर्ष में, चेतावनी वैध है। –

+0

@ लाइटनेसरेसेसिन ऑर्बिट: मुझे आश्चर्य है कि यह वास्तव में एक * त्रुटि * नहीं है। –

+0

@ केरेकस्क: जीसीसी त्रुटि देता है, केवल चेतावनी नहीं! – Nawaz

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