2011-04-08 13 views
6

यह रावल्यू क्यों अस्पष्ट है? मेरे पास एए और एए & हो सकता है और संकलक AA& का उपयोग करने के बारे में जानेंगे। लेकिन जब मैं तीसरे विकल्प में जोड़ता हूं तो मुझे एक त्रुटि मिलती है। जाहिर है एए & & एक बेहतर अधिभार है तो इंटेल के लिए int जैसे अन्य लोग लंबे समय तक बेहतर होते हैं। यह संदिग्ध क्यों है? क्या कोई तरीका है कि मैं सभी 3 ओवरलोड रख सकता हूं और इसे स्पष्ट कर सकता हूं कि मैं कौन सा चाहता हूं? (टाइपकास्टिंग (AA&&) ऐसा नहीं करेगा)।यह रावल्यू क्यों अस्पष्ट है?

struct AA{ 
    void*this_; 
    AA() { this_=this; } 
    //not valid, use AA&, AA(AA a){ this_=this; } 
    AA(AA&a){ this_=this; } 
    AA(AA&&a){ this_=a.this_; } 
}; 
void movetest(AA s) {} 
void movetest(AA& s) {} 
//This gets me the ambiguous error void movetest(AA&& s) {} 
AA&& movetest() { return AA(); } 
void MyTestCode2(){ 
    AA a; 
    AA b(a); 
    AA c = movetest(); 
    movetest(AA()); 
} 
+2

(एक तरफ ध्यान दें पर, अपने शून्य arity 'movetest' समारोह एक स्थानीय चर के लिए एक संदर्भ देता है।) – GManNickG

+0

(मैं भी हूँ सामान्य रूप से कहें कि आप तीनों ओवरलोड को वैसे भी नहीं चाहते हैं।) – GManNickG

+0

@GMan: क्या ... क्यों? है ना? हो सकता है कि आप इसे भी समझा सकें http://stackoverflow.com/questions/5591995/is-move-by-lvalue-broken-unfinished-in-msvc2010 –

उत्तर

6

मैं ए.ए. उपयोग करने के लिए ए.ए. और ए.ए. & और संकलक हो सकता है पता चल जाएगा &

हाँ, movetest (एए()) के मामले में;, केवल movetest (एए) व्यवहार्य है, क्योंकि गैर-कॉन्स के लिए (lvalue) संदर्भ एक रैल्यू से बंधे नहीं जा सकता है। हालांकि, एक रेवल्यू संदर्भ को अस्थायी रूप से सीधे से बांधता है। इस प्रकार, अधिभार संकल्प उद्देश्यों के लिए काम करता है

void movetest(AA) 
void movetest(AA&&) 

, बराबर हैं क्योंकि अंतर्निहित रूपांतरण दृश्योंए.ए. कन्वर्ट करने के लिए प्रयोग किया जाता है()ए.ए. को और ए.ए. & & क्रमश बराबर हैं। पूर्व बेहतर नहीं है, क्योंकि प्रत्यक्ष संदर्भ बाध्यकारी को पहचान रूपांतरण भी माना जाता है।

+0

नियम मूल रूप से है यदि आपके पास कोई फ़ंक्शन है जो मान द्वारा पैरामीटर लेता है आपके पास कोई अन्य ओवरलोड नहीं होना चाहिए? – Clinton

1

decltype से सहमत। यह वास्तव में इस से अलग नहीं है सी ++ 03/98 अस्पष्टता:

struct AA {}; 

void movetest(AA s) {} 
void movetest(AA& s) {} 

int main() 
{ 
    AA a; 
    movetest(a); 
} 

test.cpp:9:5: error: call to 'movetest' is ambiguous 
    movetest(a); 
    ^~~~~~~~ 
test.cpp:3:6: note: candidate function 
void movetest(AA s) {} 
    ^
test.cpp:4:6: note: candidate function 
void movetest(AA& s) {} 
    ^
1 error generated. 
संबंधित मुद्दे