2017-04-05 12 views
5

मैं std::unique_ptr को कक्षा के निर्माता के पास पास करना चाहता हूं जो std::unique_ptr के स्वामित्व वाले डेटा का स्वामित्व लेगा।स्वामित्व लेने के लिए निर्माता को std :: unique_ptr पास करना

क्या संकलक foo और bar के बीच कोई अंतर है, इस बात के संदर्भ में कि कंपाइलर उन्हें कैसे संभालता है जो उनमें से एक को बेहतर बनाता है?

foo वर्ग:

template <class T> 
class foo 
{ 
    std::unique_ptr<T> data_; 

public: 
    foo(std::unique_ptr<T>&& data) : 
     data_{ std::forward<std::unique_ptr<T>>(data) } 
    { 
    } 
}; 

bar वर्ग:

template <class T> 
class bar 
{ 
    std::unique_ptr<T> data_; 

public: 
    bar(std::unique_ptr<T> data) : 
     data_{ std::move(data) } 
    { 
    } 
}; 
+0

क्या दूसरा भी काम करता है? – 101010

+0

यदि आपकी टीम उत्तरार्द्ध द्वारा कम भ्रमित हो जाती है और आपको इसे समझाने के लिए कम समय बर्बाद कर देगी, तो बाद वाले का उपयोग करें। –

+0

@KerrekSB ने ओपी टीम को भ्रमित और समय बर्बाद करने के बारे में पूछा था? – Slava

उत्तर

5

एक संदर्भ के लिए बाध्यकारी एक कम कदम की आवश्यकता है:

void f(std::unique_ptr<T>&& p) { g(std::move(p)); } 

f(std::make_unique<T>()); // no move, g binds directly to the temporary 

एक वस्तु पैरामीटर के लिए बाध्यकारी एक वास्तविक कदम की आवश्यकता है:

void f(std::unique_ptr<T> p) { g(std::move(p)); } 

f(std::make_unique<T>()); // p constructed (= moved) from temporary, 
          // g binds to p 

अतिरिक्त कदम में एक पॉइंटर प्रति, पॉइंटर की एक सेटिंग शून्य, और एक शर्त जांच के साथ एक विनाशक शामिल है। यह एक बड़ी लागत नहीं है, और जिस शैली का उपयोग करना है, उस पर निर्भर करता है कि आप किस प्रकार के कोड लिख रहे हैं:

आपका कोड जितना अधिक पत्ता है और जितना कम इस्तेमाल होता है, उतना ही सरल संस्करण - गुजरने से आपको सादगी मिलती है। इसके विपरीत, आपका कोड जितना अधिक लाइब्रेरी है और जितना कम आप अपने उपयोगकर्ताओं को जानते हैं, उतना ही मूल्यवान लागत को लागू करने में मूल्य नहीं है, चाहे कितना छोटा हो।

आप निर्णय लेते हैं।

+0

सी ++ 17 में, उस अतिरिक्त कदम को सही तरीके से अनुकूलित करने की गारंटी दी जाएगी? – NathanOliver

+2

@NathanOliver: नहीं, इसका इसके साथ कुछ लेना देना नहीं है। यही कारण है कि मैं "गारंटीकृत प्रति elision" शब्द से नफरत करता हूं, यह सिर्फ हर किसी को भ्रमित करता है। –

+0

@NathanOliver: असल में, आपको सभी खाली "एक्स सभी वाई हल करेंगे" दावों को अस्वीकार कर देना चाहिए, वे सभी बकवास हैं। –

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