2015-10-12 5 views
6

यह स्वीकार्य रूप से एक नाइट-पिक्य प्रश्न है जो मुख्य रूप से जिज्ञासा से प्रेरित होता है। मान लीजिए कि हमें निम्नलिखित:क्या होता है जब आप एक रावल संदर्भ के लिए एक शाब्दिक स्थिर आवंटित करते हैं?

int x = 5; 
int&& xref = std::move(x); 
std::cout << "Before assignment x: " << x << std::endl; 
std::cout << "Before assignment xref: " << xref << std::endl; 
xref = 10; 
std::cout << "After assignment x: " << x << std::endl; 
std::cout << "After assignment xref: " << xref << std::endl; 

उत्पादन की उम्मीद है:

// Before assignment x: 5 
// Before assignment xref: 5 
// After assignment x: 10 
// After assignment xref: 10 

यह समझ में आता है। std::movex को एक xvalue में परिवर्तित करता है और हमें इसकी स्मृति स्थान xref पर बाध्य करने और तदनुसार इसकी सामग्री को संशोधित करने की अनुमति देता है।

int&& xref = 5; 
std::cout << "Before assignment xref: " << xref << std::endl; 
xref = 10; 
std::cout << "After assignment xref: " << xref << std::endl; 

int x = 5; 
std::cout << "After assignment x: " << x << std::endl; 

उत्पादन सहज है:: अब कहते हैं कि हमारे पास निम्न की सुविधा देता है

// Before assignment xref: 5 
// After assignment xref: 10 
// After assignment x: 5 

यह समग्र मतलब। हम लगातार शाब्दिक 5 से xref पर बाध्य करने में सक्षम होने की उम्मीद करते हैं क्योंकि 5 एक प्रसार है। हम यह भी उम्मीद करते हैं कि xref उत्परिवर्तनीय हो। हम आगे उम्मीद करते हैं कि निरंतर शाब्दिक 5 का मान संशोधित नहीं है (जैसा उपर्युक्त स्निपेट की अंतिम दो पंक्तियों में कुछ हद तक दिखाया गया है)।

तो मेरा सवाल यह है कि, वास्तव में यहां क्या चल रहा है? C++ निरंतर शाब्दिक 5 के मान को संशोधित करने के बारे में नहीं जानता है, फिर भी यह जानने के लिए xref के लिए पर्याप्त पहचान बनाए रखें कि इसे 10 असाइनमेंट द्वारा बदला गया है। क्या xref पर असाइनमेंट पर एक नया चर बनाया जा रहा है जब यह निरंतर शाब्दिक है? यह सवाल सी ++ 03 में कभी नहीं आया क्योंकि केवल कॉन्स संदर्भों को रावलों तक सीमित किया जा सकता है।

उत्तर

4

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

जीवन भर के मामले में, यह वही है जैसा आपने const int& x = 5 लिखा था; केवल, वहां, तथ्य यह है कि आप स्वचालित रूप से निर्मित अस्थायी ऑब्जेक्ट के साथ काम कर रहे हैं मास्क किया गया है क्योंकि const आपको उत्परिवर्तन के साथ इसे साबित करने से रोकता है।

[C++14: 8.5.3/5]:[..] हैं T1 एक गैर वर्ग प्रकार, प्रकार "CV1T1" बनाई गई है और उसकी प्रतिलिपि प्रारंभ (8.5) प्रारंभकर्ता अभिव्यक्ति से की एक अस्थायी है। संदर्भ तब अस्थायी के लिए बाध्य है। [..]

+1

धन्यवाद। यह मेरे प्रश्न और हर अनुवर्ती प्रश्न का उत्तर देता जो मैंने किया होगा। – Klam

+0

@ किलम: लाइटनेस इंडस्ट्रीज में यहां सेवा का सभी हिस्सा। –

5
int&& xref = 5; 

... बनाता है एक अस्थायी, 5, जिसका जीवनकाल ब्लॉक के अंत तक बढ़ा दिया गया है के साथ प्रारंभ।

काम

xref = 10; 

अभी भी जीवित अस्थायी का मूल्य बदल जाता है।

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

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