2017-07-04 30 views
6

केवल पुष्टि के लिए मैं std::move के बारे मेंक्यों std :: चाल lvaue संदर्भ की बजाय forward_reference लेता

std::move क्या समझ में आ - धर्मान्तरित T&T&& चाहते हैं ताकि T's चाल निर्माता में (किक अगर यह मौजूद होगा अन्यथा प्रतिलिपि ctor होगा जब तक हम बाहरी रूप से हटाए गए कदम ctor/असाइनमेंट नहीं हैं) तब तक इसकी भूमिका निभाएं।

जब मैं std::move के संभावित कार्यान्वयन देखा है यह है

template<typename T> 
typename remove_reference<T>::type&& move(T&& param) 
{ 
using ReturnType =typename remove_reference<T>::type&&; 
return static_cast<ReturnType>(param); 
} 

कारण यह remove_reference<T> का उपयोग करता संदर्भ गिर कि forward_reference पर लागू की वजह से है जैसे T&&

मैं सिर्फ आश्चर्य है कि क्यों हम आगे संदर्भ की आवश्यकता है, हम इसे

template<typename T> 
T&& moveInQuestion(T& p){ 
    return static_cast<T&&>(p); 
} 

struct someType{}; 
someType lvalref; 
static_assert(is_same<decltype(moveInQuestion(lvalref)),decltype(std::move(lvalref))>::value,""); 

द्वारा नहीं किया जा सका 0 विफल नहीं हुआ है।

और मैं यह भी मानना ​​है कि मूल्य वर्ग कि std::move के लिए इस मामले moveInQuestion संभवतः std::move की तुलना में बेहतर हो सकता है किया जा रहा है के साथ एक lvalue है? अपने move, इस टूट जाता है जब T, bool है के बाद से यह मामला x[0] में एक lvalue की तुलना में एक prvalue प्रॉक्सी संदर्भ बल्कि है

उत्तर

8

सामान्य उदाहरण की तरह

template<class T> 
T frob() { 
    std::vector<T> x = /* ... */; 
    return std::move(x[0]); 
} 
साथ

सामान्य कोड है।

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