2016-01-13 12 views
15

में संग्रहीत किया जाता है, आमतौर पर एक सी ++ लैम्ब्डा बिना किसी सी-स्टाइल फ़ंक्शन पॉइंटर पर should be convertable पर कैप्चर किए। किसी भी तरह, std::function::target का उपयोग करके इसे परिवर्तित करना काम नहीं करता है (यानी एक nullptr देता है), target_type हस्ताक्षर प्रकार से मेल नहीं खाता है, भले ही ऐसा लगता है।कैप्चरलेस लैम्ब्डा को फ़ंक्शन पॉइंटर में परिवर्तित नहीं किया जा सकता है जब std :: function

VC13 और जीसीसी पर परीक्षण किया गया 5,3/5.2.0/4,8

मिनिमल परीक्षण उदाहरण:

#include <functional> 
#include <iostream> 

void Maybe() { 

} 

void callMe(std::function<void()> callback) { 
    typedef void (*ftype)(); 
    std::cout << (callback.target_type() == typeid(ftype)) << std::endl; 
    std::cout << callback.target<ftype>() << std::endl; 
} 

int main() { 
    callMe([]() {}); 
    callMe(Maybe); 
} 

उम्मीद उत्पादन होगा

1 
<address> 
1 
<address> 

वास्तविक उत्पादन

0 
0 
1 
<address> 

सवाल यह है कि: लैम्ब्डा का हस्ताक्षर पारित कार्य से अलग क्यों होता है?

+0

_ "... एक को convertable होना चाहिए ..." _ - प्रशस्ति पत्र की जरूरत। – Useless

+4

@ यूसेलेस हम्म, [उद्धरण यहां है] (http://stackoverflow.com/a/28746827/1413395)। –

+0

@ πάνταῥεῖ धन्यवाद, मैंने इसे –

उत्तर

15

आपकी पहली कॉल में, std::function लैम्ब्डा को पॉइंटर में क्षीण करने से परेशान नहीं करता है, यह सिर्फ अपने वास्तविक प्रकार (जो वास्तव में void() नहीं है) के साथ स्टोर करता है।

आप बस का उपयोग करके उत्तरार्द्ध के साथ std::function निर्माण करने से पहले एक सूचक में क्षय लैम्ब्डा मजबूर कर सकते हैं एक एकल +:

callMe(+[](){}); 
// ^
+4

+1 प्रश्न में शामिल किया है, लेकिन: मैं * वास्तव में * अभिन्न/सूचक प्रकार जबरन के लिए इस '+' हैक को नापसंद करता हूं। यह सिर्फ इरादे को बहुत अस्पष्ट करता है। एक समर्पित समारोह में इसे लपेटकर इसे बेहतर बनाएं। –

+0

इसलिए हमें [यह क्यू एंड ए] (http://stackoverflow.com/questions/18889028/a-positive-lambda-what-sorcery-is-this/18889029?s=1|0.0000#18889029) का डुप्लिकेशन मिला? –

+0

@ πάνταῥεῖ वे सख्ती से डुप्लीकेट नहीं हैं (अन्य लोग टाइप कटौती और ओवरलोड रिज़ॉल्यूशन के बारे में हैं), लेकिन वे वास्तव में काफी दृढ़ता से संबंधित हैं। – Quentin

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