निम्नलिखित कार्यक्रम अवैध है, और मैं समझता हूँ कि चाहते हैं क्यों:मैं इस फ़ंक्शन में लैम्ब्डा क्यों नहीं पारित कर सकता हूं जो std :: function लेता है?
#include <functional>
#include <iostream>
template<typename Result, typename Arg>
void deduce(std::function<Result(Arg)> f)
{
std::cout << "Result: " << typeid(Result).name() << std::endl;
std::cout << "Arg: " << typeid(Arg).name() << std::endl;
}
int main()
{
auto f = [](int x)
{
return x + 1;
};
deduce(f);
return 0;
}
clang
के उत्पादन:
$ clang -std=c++11 test.cpp
test.cpp:48:3: error: no matching function for call to 'deduce'
deduce(f);
^~~~~~
test.cpp:26:6: note: candidate template ignored: could not match 'function<type-parameter-0-1 (type-parameter-0-0)>' against '<lambda at test.cpp:34:13>'
void deduce(std::function<T2(T1)> f)
^
1 error generated.
ऐसा लगता है कि मैं std::function
करने के लिए अपने लैम्ब्डा कन्वर्ट करने के लिए सक्षम होना चाहिए लगता है deduce
द्वारा प्राप्त किया गया। संकलक के लिए इस मामले में उचित रूपांतरण लागू करना क्यों संभव नहीं है?
धन्यवाद। मैं समझता हूं कि प्रकार समान नहीं हैं, लेकिन मैं समझने की कोशिश कर रहा हूं कि संकलक यहां उचित रूपांतरण क्यों लागू नहीं कर पा रहा है। –
समस्या तर्क मान का रूपांतरण नहीं है लेकिन टेम्पलेट पैरामीटर की कटौती है। एक बार वे जाने जाते हैं (जैसे मैंने पहले स्निपेट में दिया था), रूपांतरण ठीक है। मैं कोशिश करूंगा कि मैं यहां सटीक नियमों को देख सकता हूं जो यहां प्रभावी हैं। – 5gon12eder
हां, कटौती समस्या है। यह एक सटीक कटौती हो सकता है, क्योंकि अन्यथा, सब कुछ जाता है: कोई विशेषज्ञता हो सकती है, या नहीं, निरंतर रूपांतरण हो सकता है। – Deduplicator