2016-01-08 8 views
8
#include <string> 

void f(std::string&& rref){ 
} 

void f(std::string s){ 
} 

int main() { 
    std::string s = "s"; 
    f(std::move(s)); 
} 

यह कोड अस्पष्टता का कारण बनता है और मुझे नहीं पता कि शायद, मैंने रैवल्यू संदर्भ में स्पष्ट रूपांतरण क्यों किया।अस्पष्टता। लागू रूपांतरण?

मेरा विचार है कि rvalue संदर्भ परोक्ष सिर्फ lvalue में बदला जा सकता है। लेकिन मुझे यकीन नहीं है। कृपया समझाएँ।

+0

अस्पष्टता क्या है? क्या एक कंपाइलर त्रुटि संदेश था? –

+0

अस्पष्टता त्रुटि पुन: उत्पन्न: 'त्रुटि: अधिभारित कॉल 'f (std :: remove_reference और> :: प्रकार)' संदिग्ध 'नोट है: उम्मीदवार हैं: ... – Ziezi

+3

आपको दो अलग ओवरलोड की आवश्यकता क्यों है यहाँ? –

उत्तर

4

std::stringstd::string के प्रकार के एक रैल्यू से शुरू किया जा सकता है। तो दूसरा कार्य एक उम्मीदवार है।

मूल्य और रावल-संदर्भ ओवरलोड होने का एक संभावित विचार नहीं है।

void f(std::string&& rref); 
void f(std::string & lref); // or const& 

यह सब उपयोग के मामलों को कवर किया जाएगा: एक और अधिक सामान्य सेटअप rvalue-संदर्भ, और lvalue-संदर्भ भार के है।

+0

की तुलना में कोई बेहतर सुझाव नहीं है, तो इसका मतलब यह है कि std :: string द्वारा std :: string && को परिवर्तित किया जा सकता है (कन्स्ट्रक्टर को परिवर्तित करके) std :: string (std :: string && अन्य) स्ट्रिंग में ? –

+1

@ जे। डू हां यह सही है - उस रचनाकार –

+0

@ एम.एम. का उपयोग करते हुए तर्क से शुरू किया गया है जब मैं मुख्य रूप से 'std :: string && s = "s में पंक्तियों को बदलता हूं; एफ (एस); ', तो कोई अस्पष्टता नहीं है। क्या आप वाकई कन्स्ट्रक्टर समस्या है, न कि 'std :: move' xvalue-ness? – TNW

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