2014-04-11 9 views
10

मैं वहाँ एक anwser में देखा है: Is returning by rvalue reference more efficient?कॉन्स्ट संदर्भ क्वालीफायर

सदस्य समारोह परिभाषा:

Beta_ab const& getAB() const& { return ab; } 

मैं पर सीवी-क्वालीफायर (const) से परिचित हूँ सदस्य कार्य, लेकिन const& नहीं।

अंतिम const& का अर्थ क्या है?

+0

संबंधित/डुप्लिकेट: http://stackoverflow.com/q/21861148/420683 – dyp

उत्तर

18

&रेफ-क्वालीफायर है। रेफ-क्वालीफायर सी ++ 11 में नए हैं और अभी तक सभी कंपाइलरों में समर्थित नहीं हैं, इसलिए आप उन्हें अक्सर नहीं देखते हैं। यह बताता है कि इस समारोह केवल (और नहीं rvalues ​​पर) lvalues ​​पर कहा जा सकता है:

#include <iostream> 

class kitten 
{ 
private: 
    int mood = 0; 

public: 
    void pet() & 
    { 
     mood += 1; 
    } 
}; 

int main() 
{ 
    kitten cat{}; 
    cat.pet(); // ok 

    kitten{}.pet(); // not ok: cannot pet a temporary kitten 
} 

सीवी-क्वालीफायर const के साथ संयुक्त, इसका मतलब है कि आप केवल lvalues ​​पर इस सदस्य समारोह कॉल कर सकते हैं, और वे स्थिर हो सकते हैं।

+4

आप जोड़ सकते हैं कि यह C++ 11 में एक नई सुविधा है, अभी तक सभी कंपाइलरों द्वारा समर्थित नहीं है, और आप की संभावना नहीं है इसे मौजूदा कोड में देखने के लिए (अभी तक)। –

+3

इस निर्माण की प्रासंगिकता यह है कि यह 'बीटा_एबी कॉन्स और खतरे = बीटा_एब()। GetAB(); ' –

+0

ठीक है, मैं देखता हूं। तो यदि संकलक द्वारा समर्थित है, तो यह प्रत्येक सदस्य सदस्य फ़ंक्शन पर सेट किया जाना चाहिए जो एक सदस्य चर के लिए एक कॉन्स्ट संदर्भ लौटा रहा हो? मेरे पास इनमें से बहुत सारे हैं और कभी-कभी उन्हें एक रावल्यू पर इस्तेमाल करने से संबंधित बग होते हैं। – galinette

3

हम इस कोड में जानते हैं कि ...

Beta_ab const& getAB() const { return ab; } 
         ^^^^^ 

प्रकाश डाला const मतलब यह है कि सदस्य समारोह एक const वस्तु का आह्वान किया जा सकता है। फ़ंक्शन की सीवी-योग्यता के बावजूद एक सदस्य फ़ंक्शन को गैर-const ऑब्जेक्ट पर हमेशा कॉल किया जा सकता है।

इस कोड में

तो ...

Beta_ab const& getAB() const & { return ab; } 
          ^

हम उम्मीद करनी चाहिए पर प्रकाश डाला & भी क्या ऑब्जेक्ट के प्रकार इस सदस्य समारोह का आह्वान किया जा करने के लिए अनुमति दी है के बारे में कुछ का कहना है कि। हम सही होंगे; सी ++ 11 में, यह कहता है कि सदस्य कार्य केवल लालच पर ही बुलाया जा सकता है।

Beta_ab const& getAB() const& { return ab; } 
Beta_ab &&  getAB() &&  { return ab; } 

उपरोक्त उदाहरण में, पहली अधिभार lvalues ​​पर शुरू हो जाती है, और दूसरा अधिभार गैर const rvalues ​​पर शुरू हो जाती है। निम्नलिखित अधिक परिचित उदाहरण के समान, क्वालिफायर के साथ साधारण समारोह मापदंडों के लिए लागू:

void setAB(AB const& _ab) { ab = _ab; } 
void setAB(AB &&  _ab) { ab = std::move(_ab); } 

यह थोड़ा साधारण मापदंडों के लिए अलग काम करती है, हालांकि, इस उदाहरण में, पहली अधिभार एक rvalue स्वीकार करेंगे, तो दूसरी अधिभार हटा दिया गया है ।

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