2011-08-22 13 views

उत्तर

8

कि से प्रति तरह नहीं, समारोह चर a संशोधित करना होगा क्योंकि बराबर हो। जिसके अनुसार, इनलाइन करने और तुच्छ अनुकूलन का एक सा के बाद परिणाम वही होगा:

int x = func(5); 

// pseudo-inlined: 
int __temp = 5; // the temporary created by binding 5 to int&& 
__temp = 3; // a = 3; 
int x = __temp; // return a; 

// constant propagation: 
int __temp = 5; 
__temp = 3; 
int x = 3; 

// dead-code elimination: 
int x = 3; 

नोट परिणाम एक ही है जैसे कि आप func की दूसरी परिभाषा का इस्तेमाल किया और inlined, सिर्फ इसलिए कि अस्थायी चर wasn ' टी इस्तेमाल किया। इससे पता चलता है कि दो कार्य सामान्य रूप से समकक्ष नहीं हैं:

int modifyme = 100; 
int x = func(std::move(modifyme)); 

// modifyme must be 3, second function definition wouldn't do that 
+0

मैंने सोचा होगा कि इसे स्थानांतरित करने के बाद किसी ऑब्जेक्ट का मान पढ़ना यूबी है। क्या यह मामला नहीं है? –

+0

बहुत सोचा - अगर यह मामला नहीं था, तो मैं बेहद आश्चर्यचकित हूं, हालांकि प्राचीन प्रकार के लिए केवल मूल्य ही छोड़ना सबसे सस्ता विकल्प है (जटिल प्रकारों के लिए वे ऐसा नहीं कर सकते हैं, हालांकि मुझे लगता है?) – Voo

+0

मेरे विचार यह भी थे कि कम से कम पीओडी (विनाशकों के बिना) के लिए यह यूबी होगा। गैर-पीओडी के लिए उन्हें निश्चित रूप से बदला जाना चाहिए ताकि सभी पॉइंटर्स 0 पर सेट किए जा सकें ताकि विनाशक कुछ भी नहीं करेगा ... – Emil

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