2013-02-21 15 views
24

निम्नलिखित कोड MSVC2010 पर संकलित और चलाता है, है ना?क्या std :: move ड्रॉप स्थिरता चाहिए?

const std::string s = "foo"; 
std::string s2(std::move(s)); 

मैं देख सकता हूँ क्यों यह शायद कुछ भी नहीं तोड़ के बाद से मुझे पता है कि कोई भी इसका इस्तेमाल करने की तो यह बात dosn't कि मैं स्थिरांक छोड़ने कर रहा हूँ जा रहा है कि अगर मैं रों के internals ले। हालांकि, इस बारे में क्या है कि कंपाइलर रोम में कॉन्स ऑब्जेक्ट्स लागू करता है (एक एम्बेडेड एप्लिकेशन में)? क्या कदम एक प्रतिलिपि में बदल जाएगा? या एमएसवीसी मुझे एक त्रुटि दे रहा है?

+0

शायद यह कुछ अनुकूलन के कारण संकलित हो सकता है? – SomeWittyUsername

+2

@icepack no, संकलन, विशेष रूप से कॉन्स्ट शुद्धता आदि पर जांच आदि अनुकूलन से पहले रास्ता आती है। –

+1

@icepack अनुकूलन का सुनहरा नियम उतना ही नियम है। संकलक अनुकूलन नहीं कर सकता है जो व्यवहार नहीं करता है-अगर वे लागू नहीं किए गए थे (अवलोकन करने योग्य व्यवहार के संदर्भ में और भाषा के नियमों के भीतर)। –

उत्तर

29

मैं std::move(T const&) सिर्फ T const && रिटर्न लगता है। इसका मतलब है, यह वास्तव में वास्तव में स्थानांतरित नहीं किया जाएगा (क्योंकि चाल असाइनमेंट ऑपरेटर/निर्माता पैरामीटर प्रकार से मेल नहीं खाते हैं)।

क्या होता है कि निर्माता T const& लेने से मेल खाता है, lvalue (चर टाइप किया T const &&) और इस प्रकार, इस कदम एक प्रति में गिरावट होती है।

+3

@AndyProwl हर बार जब मैं यहाँ पर कुछ पूछना की तरह लगता है तुम वहाँ जवाब देने के लिए कर रहे हैं :) अपने एक अभिभावक देवदूत की बेवकूफ रूप की तरह;) – odinthenerd

+1

@PorkyBrain: कि इतने गलत लगता है: डी –

+0

मुझे लगता है कि दूसरे वाक्य थोड़ा भ्रामक है । Lvalue संदर्भ पैरामीटर * कभी नहीं * मिलान रावल संदर्भ, लेकिन एक अस्थायी एक कॉन्स-लैवल संदर्भ से बांध सकते हैं ... –

23

यह

const std::string f() { return "foo"; } 
std::string s2 = f(); 

यह था करने के लिए कोई अंतर नहीं है, एक ही समय में, सी ++ 03 की सिफारिश की है, और जब rvalue संदर्भ शुरू समिति इस कोड को नहीं था तोड़। यह बस एक प्रतिलिपि में गिरावट आई है।

+0

एक अंतर्निहित चाल की स्थिति के लिए अच्छी तुलना। +1 – sehe

+1

rationale –

+1

+1 के लिए +1 बहुत खराब मैं एकाधिक उत्तरों को स्वीकार नहीं कर सकता – odinthenerd

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