2017-06-10 17 views
6

हम दोनों विधियों को getAB() && और getAB() क्यों लागू नहीं कर सकते हैं, लेकिन इनमें से किसी एक को कार्यान्वित कर सकते हैं?हम दोनों तरीकों को 'getAB() &&` और `getAB()` क्यों लागू नहीं कर सकते?

  1. काम करता है: http://ideone.com/4EgObJ

कोड:

struct Beta { 
    Beta_ab ab; 
    Beta_ab && getAB() && { cout << "1"; return move(ab); } 
}; 

int main() {  
    Beta_ab ab = Beta().getAB(); 

    return 0; 
} 

  1. काम करता है: http://ideone.com/m9d0Tz

कोड:

struct Beta { 
    Beta_ab ab; 
    Beta_ab && getAB() { cout << "2"; return move(ab); } 
}; 

int main() { 
    Beta b; 
    Beta_ab ab = b.getAB(); 

    return 0; 
} 

  1. doen't काम करता है: http://ideone.com/QIQtZ5

कोड:

struct Beta { 
    Beta_ab ab; 
    Beta_ab && getAB() && { cout << "1"; return move(ab); } 
    Beta_ab && getAB() { cout << "2"; return move(ab); } 
}; 

int main() { 
    Beta b; 
    Beta_ab ab1 = b.getAB(); 

    Beta_ab ab2 = Beta().getAB(); 

    return 0; 
} 

क्यों कोड के पहले दो उदाहरण हैं काम करता है, लेकिन आखिरी उदाहरण काम नहीं करता है?

+0

आपकी समस्या से संबंधित नहीं है, लेकिन जब [MCVE] (https://stackoverflow.com/help/mcve) बनाते हैं तो सुनिश्चित करें कि इसमें कोई असंबंधित त्रुटियां नहीं हैं। असंबद्ध त्रुटियां वास्तविक समस्या से परेशान होती हैं। मैं निश्चित रूप से 'मुख्य' फ़ंक्शन में चर 'ab' के आपके पुनर्वितरण के बारे में बात कर रहा हूं। –

+4

यदि कोई अधिभार संदर्भ-योग्य है तो _all_ अधिभार संदर्भ-योग्य होना चाहिए - दूसरे अधिभार को 'बीटा_एब और& getAB() और {cout << "2" में बदलें; वापसी कदम (एबी); } '। (उत्तर के रूप में पोस्ट नहीं किया जा रहा है क्योंकि यह निश्चित रूप से एक डुप्ली है।) – ildjarn

+1

'बीटा_एब और& getAB()' जैसे रेफ क्वालीफायर के बिना एक ओवरलोड, को एक लवल्यू * या * एक रावल्यू पर बुलाया जा सकता है।रावल्यू रेफ क्वालीफायर के साथ एक अधिभार, 'बीटा_एबी और& getAB() && ', केवल रावल पर ही कहा जा सकता है। इसलिए, यदि दोनों को सह-अस्तित्व में रहने की अनुमति दी गई थी, तो एक रैवल्यू पर 'getAB() 'की कॉल * संदिग्ध * होगी। –

उत्तर

8

स्टैंडर्ड अनुभाग [over.load] /2.3:

एक ही नाम और एक ही पैरामीटर प्रकार सूची के साथ-साथ एक ही नाम के साथ सदस्य समारोह टेम्पलेट घोषणाओं के साथ

सदस्य समारोह घोषणाओं, वही पैरामीटर-प्रकार-सूची, और उनमें से कोई भी टेम्पलेट पैरामीटर सूचियों को अधिभारित नहीं किया जा सकता है, लेकिन सभी के पास, रेफ-क्वालीफायर है।

[उदाहरण:

class Y { 
    void h() &; 
    void h() const &; // OK 
    void h() &&;   // OK, all declarations have a ref-qualifier 
    void i() &; 
    void i() const;  // ill-formed, prior declaration of i 
         // has a ref-qualifier 
}; 

- अंत उदाहरण]

यह पूरी तरह से मेरे लिए स्पष्ट वास्तव में क्यों हम इस नियम की जरूरत नहीं है, लेकिन यह है कि यह क्या है। (। हालांकि मैं अधिभार संकल्प नियमों में कुछ काम करने के लिए कुछ काम ले जाएगा, कम से कम कोशिश कर के विकल्प लगता है)

समाधान स्पष्ट है: अपने "2" अधिभार के लिए एक lvalue (&) रेफरी-क्वालीफायर जोड़ सकते हैं ताकि एक केवल रावल लेता है और केवल एक ही लेवल लेता है।

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