2012-01-15 8 views
8

कोड नीचे चला जाता है:वेक्टर <T> :: स्वैप और अस्थायी वस्तु

#include <vector> 

int main() 
{ 
    vector<int> v1(5,1); 
    v1.swap(vector<int>()); //try to swap v1 with a temporary vector object 
} 

कोड ऊपर संकलन नहीं कर सकता, त्रुटि:

error: no matching function for call to ‘std::vector<int, std::allocator<int> >::swap(std::vector<int, std::allocator<int> >)’ 

लेकिन, अगर मैं कुछ इस तरह के कोड बदलने के लिए, यह संकलित कर सकते हैं:

int main() 
{ 
    vector<int> v1(5,1); 
    vector<int>().swap(v1); 
} 

क्यों?

उत्तर

9

क्योंकि vector<int>()rvalue (एक अस्थायी, मोटे तौर पर बोलने वाला) है, और आप एक गैर-const किसी रावल्यू के संदर्भ को बाध्य नहीं कर सकते हैं। तो इस मामले में, आप इसे गैर-const संदर्भ लेने वाले फ़ंक्शन में पास नहीं कर सकते हैं।

हालांकि, यह अस्थायी पर सदस्य कार्यों को आमंत्रित करने के लिए बिल्कुल ठीक है, यही कारण है कि आपका दूसरा उदाहरण संकलित करता है।

+0

क्या आप "वेक्टर () 'पर एक अधिक जानकारी प्रदान कर सकते हैं"? 'rvalue'' = 'के दाईं ओर दिखाई देना चाहिए, है ना? – Alcott

+0

@ एल्कॉट: यह उससे अधिक सामान्य है। Http://en.wikipedia.org/wiki/Value_(computer_science देखें)। –

+0

मुझे यह आलेख रैल्यू को समझने में बहुत उपयोगी पाया गया: http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html – Adam

6

कॉल v1.swap(std::vector<int>()) एक अस्थायी (यानी std::vector<int>()) को गैर-कॉन्स्ट संदर्भ में बांधने का प्रयास करता है। यह अवैध है और विफल रहता है। दूसरी तरफ, std::vector<int>().swap(v1) का उपयोग करके [गैर-कॉन्स] अस्थायी पर एक गैर-कॉन्स्ट फ़ंक्शन कॉल किया जाता है जिसे अनुमति है।

सी ++ 2011 में मैं सोचा होगा कि घोषणा std::vector<T>::swap(T&&) से बदल दिया जाएगा और यह इस प्रकार temporaries साथ swap() (लेकिन, जाहिर है, अभी भी नहीं const के साथ वस्तुओं) का उपयोग करने के लिए ठीक हो जाएगा। जैसा कि जीएमएन ने बताया कि यह मामला नहीं है।

+1

नहीं, बस 'स्वैप (टी एंड) '। – GManNickG

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