2016-01-20 18 views
14
class A{ 
public: 
    virtual ~A() {}; 
}; 

class B : public A{ }; 

int main(){ 

    A&& p = B(); 

    dynamic_cast<B&&>(std::move(p)); 

} 

त्रुटि (छ ++ 5.2.0) फेंकता। मैंने सोचा होगा कि p को एक रावल्यू संदर्भ में परिवर्तित करने से पहले एक रैवल्यू के रूप में डालना आवश्यक है, लेकिन अगर मैं std::move को हटा देता हूं तो यह ठीक से संकलित होता है। cppreference से:dynamic_cast और rvalue संदर्भ

dynamic_cast <new_type> (expression)

अन्य कलाकारों भाव की तरह, परिणाम है:

एक lvalue अगर कर NEW_TYPE हो एक lvalue संदर्भ प्रकार है (अभिव्यक्ति एक lvalue होना चाहिए)

एक XValue यदि new_type एक रावल्यू संदर्भ प्रकार है (अभिव्यक्ति lvalue या rvalue हो सकता है)

N3337 की भी 5.2.7:

dynamic_cast<T>(v)

हैं टी एक सूचक प्रकार है, वी कक्षा प्रकार पूरा करने के लिए एक सूचक की एक prvalue होगा, और परिणाम प्रकार टी के एक prvalue है यदि टी एक lvalue संदर्भ प्रकार है, v एक पूर्ण वर्ग प्रकार का एक lvalue होगा, और परिणाम टी द्वारा निर्दिष्ट प्रकार का एक lvalue है अगर टी एक rvalue संदर्भ प्रकार है, वी एक अभिव्यक्ति होगी पूर्ण वर्ग प्रकार, और परिणाम टी द्वारा निर्दिष्ट प्रकार का एक xvalue है।

एकमात्र आवश्यकता है कि मैं एक पूर्ण वर्ग प्रकार का उपयोग करता हूं, जो std::move(p) है, है ना?

+1

क्लैंग को आपके कोड – Cubbi

+0

के साथ कोई समस्या नहीं है gcc 5.3 के साथ पुष्टि की। हालांकि, 'std :: move' कॉल के बिना काम करता है। ;) – erip

+0

... जैसा कि आपने अपने प्रश्न में नोट किया था।मुझे प्रश्नों को और अच्छी तरह से पढ़ना चाहिए। – erip

उत्तर

6

आपका कोड ज़ाहिर है, है, ठीक:

तो T एक rvalue संदर्भ प्रकार है, v एक पूरा वर्ग प्रकार होने एक अभिव्यक्ति की जाएगी, और परिणाम प्रकार का एक XValue संदर्भित किया जाता है T तक।

मुमकिन है, dynamic_cast ठीक से अपडेट नहीं किया गया था जब rvalue संदर्भ शुरू किए गए थे, और अभी भी पूर्व सी ++ 11 नियम है कि rvalues ​​केवल const lvalue संदर्भ (ध्यान दें कि यह और भी काम नहीं करता है करने के लिए बाध्य किया जाएगा लागू करता है लक्ष्य संदेश को B const&& पर बदलने के बावजूद, त्रुटि संदेश द्वारा निहित होने के बावजूद!)।

#69390 के रूप में दायर की गई।

2

यह बजाय काम करने के लिए लगता है:

B&& b = std::move(dynamic_cast<B&>(p)); 

आपको नहीं बता सकते हैं क्यों तुम्हारा गलत है।

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