2013-06-27 14 views
10

द्वारा स्थानांतरित सक्षम कक्षाओं के लिए इन दोनों के बीच कोई अंतर है?मूल्य या रावल्यू-रेफ

struct Foo { 
typedef std::vector<std::string> Vectype; 
Vectype m_vec; 
//this or 
void bar(Vectype&& vec) 
{ 
    m_vec = std::move(vec); 
} 
//that 
void bar(Vectype vec) 
{ 
    m_vec = std::move(vec); 
} 
}; 
int main() 
{ 
    Vectype myvec{"alpha","beta","gamma"}; 
    Foo fool; 
    fool.bar(std::move(myvec)); 
} 

मेरे समझ है कि अगर आप एक lvalue myvec का उपयोग आप भी की Foo::bar()Vectype&& के बाद से बाध्य नहीं होगा const Vectype& संस्करण को पेश करने के लिए आवश्यक है। यह एक तरफ है, रावल्यू मामले में, Foo::bar(Vectype) चालक कन्स्ट्रक्टर का उपयोग करके वेक्टर का निर्माण करेगा या बेहतर है कि प्रतिलिपि सभी को एक साथ जोड़कर देखें, वीसी एक रावल्यू है (क्या होगा?)। तो क्या लेल्यू और रावल्यू ओवरलोड के बजाय मूल्य घोषणा द्वारा प्राथमिकता प्राप्त करने का कोई अनिवार्य कारण नहीं है? (मुझे किसी भी मामले में वेक्टर को सदस्य चर में कॉपी करने की आवश्यकता है।)

+0

किसी भी पेडेंट्री से पहले मुझे पता है कि ओवरलोड्स महत्वाकांक्षी हैं। –

उत्तर

3

पास-बाय-वैल्यू फ़ंक्शन पर्याप्त (और समतुल्य) है, जब तक कि तर्क प्रकार में एक कुशल चालक कन्स्ट्रक्टर होता है, जो इस मामले में std::vector के लिए सच है।

अन्यथा, पास-बाय-वैल्यू फ़ंक्शन का उपयोग करके पास-बाय-रावल-रेफ फ़ंक्शन का उपयोग करने की तुलना में अतिरिक्त प्रति-निर्माण शुरू हो सकता है।

संबंधित प्रश्न Do I need to overload methods accepting const lvalue reference for rvalue references explicitly? पर उत्तर https://stackoverflow.com/a/7587151/1190077 देखें।

2

हां, पहले एक (Vectype&& vec) किसी कॉन्स्ट ऑब्जेक्ट या बस lvalue को स्वीकार नहीं करेगा।

यदि आप ऑब्जेक्ट को अपने जैसा ही सहेजना चाहते हैं, तो इंटरफ़ेस में प्रतिलिपि बनाना (या यदि आप एक रावल्यू पास करते हैं तो स्थानांतरित करें) और फिर आगे बढ़ें, जैसे आपने अपने दूसरे उदाहरण में किया था।

5

पास-बाय-वैल्यू संस्करण एक लालसा तर्क की अनुमति देता है और इसकी एक प्रति बनाता है। रैवल्यू-रेफरेंस वर्जन को लवल्यू तर्क के साथ नहीं कहा जा सकता है।

उपयोग const Type& जब आप Type& और Type&& भार के जब का उपयोग बिल्कुल बदल सकते हैं या तर्क को कॉपी करने की जरूरत नहीं है, उपयोग पारित-दर-मूल्य जब आप एक परिवर्तनीय मूल्य चाहते हैं, लेकिन कोई परवाह नहीं है आप इसे कैसे मिलता है, और आप संदर्भ के आधार पर कुछ अलग होना चाहते हैं।

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