लेकिन यह समझा नहीं गया कि यह पैरामीटर से क्यों मेल नहीं खा सकता है।
टेम्पलेट कटौती बिल्कुल प्रकारों से मेल खाने का प्रयास करती है। यदि प्रकारों को कम नहीं किया जा सकता है, तो कटौती विफल हो जाती है। रूपांतरण कभी नहीं माना जाता है।
इस एक्सप्रेशन में:
qux(ts, [](const T&) { return 42; });
लैम्ब्डा अभिव्यक्ति के प्रकार के कुछ अद्वितीय, अनाम प्रकार है। जो भी प्रकार है, यह निश्चित रूप से To(const From&)
नहीं है - इसलिए कटौती विफल हो जाती है।
अगर मैं qux
एक गैर टेम्पलेट कार्य करना, T
और To
int
साथ साथ From
की जगह, यह संकलित करता है।
यह सच नहीं है। हालांकि, अगर तर्क पॉइंटरसंदर्भ के बजाय कार्य करने के लिए कार्य करने के लिए किया गया था, तो यह होगा। ऐसा इसलिए है क्योंकि कोई कैप्चर वाला लैम्ब्डा समकक्ष फ़ंक्शन पॉइंटर प्रकार के लिए पूरी तरह से परिवर्तनीय है। कटौती के संदर्भ के बाहर इस रूपांतरण की अनुमति है।
template <class From, class To>
void func_tmpl(From(*)(To)) { }
void func_normal(int(*)(int)) { }
func_tmpl([](int i){return i; }); // error
func_tmpl(+[](int i){return i; }); // ok, we force the conversion ourselves,
// the type of this expression can be deduced
func_normal([](int i){return i; }); // ok, implicit conversion
यह वही कारण है कि यह विफल हो जाता है:
template <class T> void foo(std::function<T()>);
foo([]{ return 42; }); // error, this lambda is NOT a function<T()>
लेकिन यह सफल होता है:
void bar(std::function<int()>);
bar([]{ return 42; }); // ok, this lambda is convertible to function<int()>
पसंदीदा दृष्टिकोण प्रतिदेय के प्रकार निकालना होगा और std::result_of
का उपयोग करके परिणाम निकालें:
template <class From,
class F&&,
class To = std::result_of_t<F&&(From const&)>>
void qux(std::vector<From> const&, F&&);
अब आप अपना लैम्ब्डा, या फ़ंक्शन, या फ़ंक्शन ऑब्जेक्ट बस ठीक कर सकते हैं।
सबसे पहले 'qux' कुछ भी वापस नहीं कर रहा है, इसलिए इसे' ऑटो बार = qux ... ' – nbro
@nbro संकलित नहीं करना चाहिए, जिसके पास समस्या से कोई लेना देना नहीं है। – emlai
यदि आप इतना जानते हैं तो आप एक प्रश्न नहीं पूछेंगे। वैसे भी, ऊपर उठाया क्योंकि मैं भी नहीं जानता क्यों। – nbro