2011-08-21 18 views
5

मेरे कंपाइलर जीसीसी-4.6 के अनुसार नीचे दिए गए उदाहरण में func को कॉल अस्पष्ट है।संदिग्ध कॉल (char * से lambda बनाम std :: string) से रूपांतरण

void func(const std::string &str) { 
} 

void func(std::function<std::string()> f) { 
} 

void test() { 
    func("Hello"); 
} 

क्या यह कहने में संकलक सही है? अगर मैं पहले अधिभार को हटा देता हूं तो यह कोड संकलित नहीं होगा क्योंकि इसमें शामिल टेम्पलेट्स को तुरंत चालू करने में विफल रहेगा।

क्या किसी भी दो कार्यों में से किसी एक का नाम बदलने या स्पष्ट रूप से std :: string में परिवर्तित करके इसके हल करने के लिए वैसे भी है?

उत्तर

3

तुम भी स्पष्ट रूप से स्ट्रिंग शाब्दिक मामले पर कब्जा करने के एक तिहाई अधिभार जोड़ सकते हैं:

void func(char const* cstr) { 
    return func(std::string(cstr)); 
} 
4

यह std::function के निर्माता में SFINAE द्वारा हल किया जा सकता है। हालांकि, ऐसा लगता है कि यह आवश्यक नहीं है और जीसीसी द्वारा प्रदान नहीं किया जाता है। इसलिए आप काम पर निर्भर नहीं कर सकते हैं।

+0

हास्यास्पद लगता है! –

+1

@ टोमालक: यह है। – Puppy

+0

मुझे यह भी यकीन नहीं है कि कार्यान्वयन को ऐसा करने की अनुमति है या नहीं। मुझे खुशी होगी अगर कोई स्पेस संदर्भ पा सकता है या आगे समझा सकता है। –

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