सी ++ डबल एड्रेस ऑपरेटर? (&&)


137

मैं एसटीएल स्रोत कोड पढ़ रहा हूं और मुझे पता नहीं है कि &&पता ऑपरेटर क्या करना चाहिए। यहाँ से एक कोड उदाहरण है stl_vector.h:

vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
    // NB: DR 675.
    this->clear();
    this->swap(__x); 
    return *this;
}

क्या "एड्रेस ऑफ़ एड्रेस" से कोई मतलब है? केवल एक के बजाय इसके दो एड्रेस ऑपरेटर क्यों हैं?


2
शायद यह एक संदर्भ का एक पता है।
गब्बर

1
@Gabe; यह एक घोषणा है ताकि यह एक संदर्भ के लिए एक संदर्भ बना दे, जिसका कोई मतलब नहीं है क्योंकि संदर्भ को ही संशोधित नहीं किया जा सकता है। पता-का उपयोग केवल कोड में किया जा सकता है, न कि घोषणा करते समय (इस मामले में एक पैरामीटर, या अन्यथा)। हालांकि ऐसा कुछ भी कभी नहीं देखा।
फाल्स्ट्रो

5
यहां तक ​​कि अगर केवल एक ही था &, तो इसका पता ऑपरेटर के पते से कोई लेना-देना नहीं था, लेकिन इसके बजाय यह संकेत दें कि __xयह एक संदर्भ है।
sepp2k

जवाबों:


112

यह C ++ 11 कोड है। C ++ 11 में, &&टोकन का अर्थ "रेवल्यू रेफरेंस" हो सकता है।


175

&&C ++ 11 में नया है। int&& aका अर्थ है "ए" एक आर-मूल्य संदर्भ है। &&आम तौर पर केवल एक फ़ंक्शन के पैरामीटर को घोषित करने के लिए उपयोग किया जाता है। और यह केवल एक आर-मूल्य अभिव्यक्ति लेता है। यदि आपको नहीं पता कि r-value क्या है, तो सरल व्याख्या यह है कि इसमें मेमोरी एड्रेस नहीं है। जैसे संख्या 6, और वर्ण 'v' दोनों ही r- मान हैं। int a, एक एल-मूल्य है, हालांकि (a+2)एक आर-मूल्य है। उदाहरण के लिए:

void foo(int&& a)
{
    //Some magical code...
}

int main()
{
    int b;
    foo(b); //Error. An rValue reference cannot be pointed to a lValue.
    foo(5); //Compiles with no error.
    foo(b+3); //Compiles with no error.

    int&& c = b; //Error. An rValue reference cannot be pointed to a lValue.
    int&& d = 5; //Compiles with no error.
}

आशा है कि जानकारीपूर्ण है।


11
एकमात्र उदाहरण मैं चाहूंगा कि आप यह जोड़ें कि यह std :: चाल के साथ कैसे काम करता है। दिखा रहा है कि क्या होगा int&& c = std::move( b );, आदि
Zzzach ...

2
ऐसा लगता है कि 15 फरवरी, 2018 को यहां ट्यूटोरियल के लिए Sravani S ने blatantly से आपकी सराहना की है
गेब्रियल स्टेपल्स

3
मैंने अभी TutorialsPoint भेजा है इस संदेश । लेख, जैसा कि उनके द्वारा प्रतिपादित किया गया है, इस तरह दिखता है
गेब्रियल स्टेपल्स

86

&&C ++ 11 में नया है, और यह दर्शाता है कि फ़ंक्शन RValue-Reference को स्वीकार करता है - अर्थात, एक तर्क का संदर्भ जो नष्ट होने वाला है।


@bronekk: क्या आपने इस संदेश पर पोस्ट की तारीख देखी? इसे 28 दिसंबर 2010 को प्रकाशित नहीं किया गया था।
बिली ओनली

इस बारे में खेद, अब हटा दिया गया। अगली बार अधिक सावधानी
बरतेंगे

34

जैसा कि अन्य जवाबों में उल्लेख किया गया है, &&इस संदर्भ में टोकन C ++ 0x (अगला C ++ मानक) के लिए नया है और एक "संदर्भ संदर्भ" का प्रतिनिधित्व करता है।

रिवाल्यू संदर्भ आगामी मानक में अधिक महत्वपूर्ण नई चीजों में से एक है; वे वस्तुओं पर 'चाल' शब्दार्थ के लिए समर्थन सक्षम करते हैं और फ़ंक्शन कॉल की पूर्ण अग्रेषण की अनुमति देते हैं।

यह एक बल्कि जटिल विषय है - सबसे अच्छा परिचय में से एक (जो केवल सरसरी नहीं है) स्टीफ़न टी। लावेज द्वारा एक लेख है, "रिव्यू सन्दर्भ: C ++ 0x विशेषताएँ VC10, भाग 2 में"

ध्यान दें कि लेख अभी भी काफी भारी है, लेकिन अच्छी तरह से पढ़ने योग्य है। और भले ही यह Microsoft VC ++ ब्लॉग पर हो, सभी (या लगभग सभी) जानकारी किसी भी C ++ 0x कंपाइलर पर लागू होती है।


&&खुद टोकन नया नहीं है; घोषणाओं में इसका अर्थ है। लेकिन आप जानते थे कि
aschepler

इस संदर्भ में यह नया है। लेकिन C / C ++ के लिए अत्यधिक पारंपरिक है कि इसके टोकन को अलग-अलग संदर्भों में अलग-अलग अर्थ दिया जा सके।
मार्टिन यॉर्क

1
@aschkleper - बेशक ... तार्किक-और ऑपरेटर ने भी मेरे दिमाग में प्रवेश नहीं किया। मैं जवाब अपडेट कर दूंगा।
माइकल बुर

5

मेरा मानना ​​है कि एक चाल ऑपरेटर है। operator=असाइनमेंट ऑपरेटर है, कहते हैं vector x = vector yclear()समारोह कॉल की तरह के रूप में अगर यह एक स्मृति रिसाव को रोकने के लिए वेक्टर की सामग्री को हटा रहा है लगता है। ऑपरेटर नए वेक्टर में एक सूचक लौटाता है।

इस तरफ,

std::vector<int> a(100, 10);
std::vector<int> b = a;
for(unsigned int i = 0; i < b.size(); i++)
{
    std::cout << b[i] << ' ';
}

भले ही हमने वेक्टर को एक मान दिया हो, वेक्टर b के मान हैं। यह का जादू है operator=()!

MSDN - मूव कंस्ट्रक्टर कैसे बनाएं


1
इस 4 वर्षीय प्रश्न में आपका उत्तर क्या है, जो पहले से ही अन्य उत्तरों में शामिल नहीं किया गया है?
मैन

5
मुझे इस तरह का कोई जवाब नहीं मिला इसलिए मैंने इसे जोड़ने का फैसला किया। मैं आज ही गुगली करके इस सवाल पर आया था।
यश १०
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.