में संग्रहीत किया जाता है, आमतौर पर एक सी ++ लैम्ब्डा बिना किसी सी-स्टाइल फ़ंक्शन पॉइंटर पर 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>
सवाल यह है कि: लैम्ब्डा का हस्ताक्षर पारित कार्य से अलग क्यों होता है?
_ "... एक को convertable होना चाहिए ..." _ - प्रशस्ति पत्र की जरूरत। – Useless
@ यूसेलेस हम्म, [उद्धरण यहां है] (http://stackoverflow.com/a/28746827/1413395)। –
@ πάνταῥεῖ धन्यवाद, मैंने इसे –