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)
है, है ना?
क्लैंग को आपके कोड – Cubbi
के साथ कोई समस्या नहीं है gcc 5.3 के साथ पुष्टि की। हालांकि, 'std :: move' कॉल के बिना काम करता है। ;) – erip
... जैसा कि आपने अपने प्रश्न में नोट किया था।मुझे प्रश्नों को और अच्छी तरह से पढ़ना चाहिए। – erip