2015-01-21 8 views
27

हाल ही में मैं API of boost::optional के माध्यम से पढ़ रहे हैं और लाइनों भर में आया के लिए विनिर्देशक:स्थिरांक और, और और && सी में सदस्य कार्यों ++

T const& operator *() const& ; 
T&  operator *() & ; 
T&&  operator *() && ; 

मैं भी अपने खुद के कार्यक्रम ने लिखा है कि के रूप में स्थिरांक &, & और सदस्य कार्यों को परिभाषित करता है & & (ध्यान दें कि मैं रिटर्न प्रकार के बारे में बात नहीं कर रहा हूं, लेकिन सेमीफाइनल से ठीक पहले विनिर्देशक) और वे ठीक काम करने लगते हैं।

मुझे पता है कि यह एक सदस्य समारोह स्थिरांक घोषित करने के लिए इसका मतलब है, लेकिन किसी को यह क्या यह const &, & और & & घोषित करने के लिए इसका मतलब है व्याख्या कर सकते हैं।

+1

स्टैक ओवरफ़्लो लॉन्च होने के 6 साल बाद यह डुप्लिकेट नहीं है? –

उत्तर

20

const& का अर्थ है कि यह अधिभार केवल कॉन्स, गैर-कॉन्स और लैवल्यू ऑब्जेक्ट के लिए उपयोग किया जाएगा।

const A a = A(); 
*a; 

& का मतलब है कि इस अधिभार केवल गैर स्थिरांक वस्तु के लिए इस्तेमाल किया जाएगा।

A a; 
*a; 

&& का मतलब है कि इस अधिभार केवल rvalue वस्तु के लिए इस्तेमाल किया जाएगा।

*A(); 

सी ++ 11 मानक की इस सुविधा के बारे में अधिक जानकारी के लिए आप इस पोस्ट What is "rvalue reference for *this"?

+5

यदि यह मदद करता है, तो मैं इन क्वालीफायरों को '* इस' ऑब्जेक्ट पर लागू करने के बारे में सोचना पसंद करता हूं जो "गुप्त रूप से" विधियों के पहले तर्क के रूप में पारित होता है। –

+4

'const &' और '&' का अर्थ है कि उनका उपयोग 'const' और non-'const' * lvalue * के लिए किया जाएगा। '&&' का उपयोग केवल एक रावल्यू के लिए किया जाएगा, जरूरी नहीं कि एक संदर्भ। – Angew

+0

@Angew धन्यवाद, सही किया गया। – ForEveR

18

यह सदस्य समारोह रेफरी-क्वालिफायर है पढ़ सकते हैं, यह सी ++ 11 में अतिरिक्त विशेषताओं में से एक है। फ़ंक्शन रेफ-क्वालीफायर (some details) निर्दिष्ट करके अंतर्निहित this ऑब्जेक्ट पैरामीटर एक लवल्यू या रावल्यू है या नहीं, इस पर आधारित गैर स्थैतिक सदस्य फ़ंक्शंस को अधिभार करना संभव है।

गैर स्थैतिक सदस्य फ़ंक्शन के लिए एक रेफ-क्वालीफायर निर्दिष्ट करने के लिए, आप या तो & या && के साथ फ़ंक्शन अर्हता प्राप्त कर सकते हैं।

#include <iostream> 
struct myStruct { 
    void func() & { std::cout << "lvalue\n"; } 
    void func() &&{ std::cout << "rvalue\n"; } 
}; 

int main(){ 
    myStruct s; 
    s.func();   // prints "lvalue" 
    std::move(s).func(); // prints "rvalue" 
    myStruct().func(); // prints "rvalue" 
} 
संबंधित मुद्दे