2011-09-22 20 views
5

मैं नए फ़ंक्शन std :: move() के बारे में थोड़ा उत्सुक हूं जिसे अभी नवीनतम सी ++ मानक में जोड़ा गया है।टाइप कास्टिंग और std :: move() का उपयोग करने के बीच अंतर?

इसके बारे में एक लेख पढ़ रहा समाप्त हो गया और पता चला कि समारोह की परिभाषा

namespace std { 
     template <class T> 
     inline typename remove_reference<T>::type&& move(T&& x) 
     { 
      return x; 
     } 
} 

है यह लगता है जैसे कि यह std :: चाल बुला और कास्टिंग का उपयोग कर के बीच कोई अंतर नहीं है।

उदाहरण यहाँ के लिए,

class NPC{ 
    int m_number1; 
    int m_number2; 
public: 
    NPC() : m_number1(1), m_number2(2) { 
     cout << "NPC Constructor called!" << endl; 
    } 

    NPC(NPC&& _npc) : m_number1(_npc.m_number1), m_number2(_npc.m_number2) { 
     _npc.m_number1 = 0; 
     _npc.m_number2 = 0; 

     cout << "NPC Move Constructor called!" << endl; 
    } 
}; 


int main() { 
    NPC n1; 
    NPC n2 = std::move(n1); 

    cout << "----------------" << endl; 
    NPC n3; 
    NPC n4 = (NPC&&)n3; 
    return 0; 
} 

यह सही सोचने के लिए मूल रूप से कोई अंतर नहीं है वहाँ है? ठीक है, मुझे पूरा यकीन है कि मैं सही हूं लेकिन यह भी जानता हूं कि हमेशा आत्मविश्वास होने पर हमेशा पीछे हटना पड़ता है।

अग्रिम धन्यवाद!

उत्तर

9

std::move एक विशेष कलाकारों के रूप में परिभाषित किया गया है:

static_cast<typename remove_reference<T>::type&&>(t) 

आप ऐसा कर सकता है यदि आप वास्तव में चाहते हैं। लेकिन अगर आप std::move का उपयोग करते हैं तो यह सब कुछ आप के लिए बहुत छोटा और स्पष्ट होगा। & & कास्टिंग अजीब हैं, इसलिए move और forward का उपयोग करना सबसे अच्छा है, जब आपका यही मतलब है।

+0

धन्यवाद! यह मुझे बहुत मदद करता है! –

2

हां, std::move कार्यक्षमता के मामले में कुछ भी नहीं करता है। इसका उद्देश्य एक आभासी को एक xvalue में परिवर्तित करना है, जो परिणाम को चलने योग्य बनाता है। यह कास्ट का उपयोग करने से बेहतर है क्योंकि यह उद्देश्य स्पष्ट करता है।

+0

धन्यवाद! मैं std :: move का उपयोग करूंगा! –

5

कार्यक्षमता में कोई अंतर नहीं है, लेकिन पठनीयता में कोई अंतर है।

बस के रूप में while छोरों goto रों को प्राथमिकता दी जाती है, और C++ शैली डाले सी शैली के लिए पसंद किया जाता है क्योंकि यह एक कम सामान्य उपकरण है लेती है, std::move कास्टिंग के लिए पसंद किया जाता है, और इसलिए यह समझना कि यह क्या है आसान है किसी भी आगे कोड की संरचना की जांच किए बिना कर रहे हैं।

+0

धन्यवाद! मैं इसकी सराहना करता हूं –

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