2012-10-16 15 views
9
// Compiled by Visual Studio 2012 

struct A 
{ 
    bool operator ==(const A& other) const 
    { 
     for (decltype(this->n) i = 0; i < n; ++i) // OK 
     {} 

     return true; 
    } 

protected: 
    size_t n; 
}; 

struct B : public A 
{ 
    bool operator ==(const B& other) const 
    { 
     for (decltype(this->n) i = 0; i < n; ++i) // error C2105: '++' needs l-value 
     {} 

     return true; 
    } 
}; 

क्या यह वीसी ++ 2012 का एक बग है?क्या घोषित एक आर-वैल्यू घोषित कर सकता है?

+1

प्रकार आर-वैल्यू या एल-वैलेस नहीं हैं; प्रकार * प्रकार * हैं। एल-वैल्यू/आर-वैल्यू वर्गीकरण * एक्सप्रेशन * के लिए है। –

+0

संदर्भ के लिए, यह सी ++ 0x ध्वज के साथ जीसीसी 4.6.3 के तहत संकलित करता है। मुझे लगता है कि यह सही है, आपके लूप दोनों समान हैं। –

+0

बी :: ऑपरेटर == में टाइप I के लिए टाइप को कॉन्स int के रूप में घटाया गया है, जो वीसी बग की तरह दिखता है। – Andrey

उत्तर

6

यह एक वीएस2012 कंपाइलर बग प्रतीत होता है। धारा 7.1.6.2, अनुच्छेद 4 में यह स्पष्ट है। वास्तव में, दिए गए उदाहरणों में से एक अभिव्यक्ति दिखाता है जो एक कॉन्स्ट-पॉइंटर a के माध्यम से संदर्भ देता है। decltype(a->x) उपज double, जबकि decltype((a->x)) उपज double const & उत्पन्न करता है।

तो यह एक बग है; संकलक सोचता है कि iconst है, और इसलिए ++ नहीं हो सकता है।