के चाल असाइन ऑपरेटर को आमंत्रित करने के लिए std :: move की आवश्यकता क्यों है I C++ 11 सीख रहा हूं और मेरे पास सैमसंग और रावल संदर्भों के बारे में कोई प्रश्न है। मेरे नमूना कोड के रूप में निम्नलिखित (सी ++ शैल यूआरएल cpp.sh/8gt है):std :: vector
#include <iostream>
#include <vector>
void aaa(std::vector<int>&& a)
{
std::cout << "size of a before move: " << a.size() << std::endl;
std::vector<int> v;
v = a; /*std::move(a)*/
std::cout << "size of a after move: " << a.size() << std::endl;
}
int main()
{
std::vector<int> foo (3,0);
aaa(std::move(foo));
return 0;
}
का परिणाम है:
size of a before move: 3 size of a after move: 3
यह std :: वेक्टर के इस कदम असाइन ऑपरेटर लगता है फंक्शन aaa
में v = a
लाइन पर नहीं बुलाया जाता है, अन्यथा a
के बजाय आकार 0 होगा।
हालांकि अगर मैंबदलता हूंv = std::move(a)
के उत्पादन कदम से पहले एक के
आकार बन गया: 3
एक चाल के बाद की का आकार: 0
और मैं एसटीडी की चाल असाइन ऑपरेटर thinke :: वेक्टर यह लागू कर दिया गया है पहर।
मेरा quesiton यही है कि असाइन ऑपरेटर पहली बार क्यों नहीं बुलाया जाता है? सी ++ संदर्भ std :: वेक्टर के अनुसार एक असाइन ऑपरेटर है जो एक रावल्यू संदर्भ लेता है।
प्रतिलिपि (1) वेक्टर & ऑपरेटर = (स्थिरांक वेक्टर & x);
चाल (2) वेक्टर & ऑपरेटर = (वेक्टर & & x);
प्रारंभकर्ता सूची (3) वेक्टर & ऑपरेटर = (प्रारंभकर्ता_सूची आईएल);
फिर v = a
पर लाइन के रूप में, जिसे रैवल्यू संदर्भ के रूप में घोषित किया गया है, चालक ऑपरेटर को बुलाया जाना चाहिए। हमें अभी भी std :: move के साथ लपेटने की आवश्यकता क्यों है?
अग्रिम में बहुत धन्यवाद!
[संपादित करें] मुझे लगता है कि लूपुन्रोलर और केरेक एसबी दोनों ने मेरे प्रश्न का उत्तर दिया। धन्यवाद! मुझे नहीं लगता कि मैं दो उत्तरों चुन सकता हूं इसलिए मैं पहले व्यक्ति को चुनूंगा।
एक अभिव्यक्ति संदर्भ * परिवर्तनीय * का संदर्भ देने वाला एक अभिव्यक्ति एक अंतराल है, क्योंकि आप चर कई बार संदर्भित कर सकते हैं। – dyp
क्योंकि "rvalue संदर्भ" एक बुरा और भ्रमित नाम है। और क्योंकि सी ++ खराब और भ्रमित है। –
यह निश्चित रूप से एक अच्छी बात है (एक बुरे और भ्रमित तरीके से)। अन्यथा, 'v = a' चुपचाप' ए 'को संशोधित करेगा, जिससे वास्तव में' auto_ptr'-शैली की अजीबता का कारण बनता है जो सेमेन्टिक्स को स्थानांतरित करने का इरादा रखता था। –